essayer de créer un mappeur pour un objet Microsoft Office à Poco's et a trouvé ce
foreach(var field in tgt.GetFields() ){ var pv = o.InvokeMember(field.Name, System.Reflection.BindingFlags.GetProperty, null, o, null); i.SetValue(rc, pv); }
3 Réponses :
C'est parce que l'objet COM est récemment lié. Le temps d'exécution ne sait pas quelles méthodes / propriétés seront disponibles sur un objet COM jusqu'à ce qu'ils soient accessibles / invoqués. P>
Voici quelques bons articles sur le sujet: p>
http://support.microsoft.com/default. ASPX? SCID = KB; FR-US; Q302902 P>
http: // www.codeproject.com/articles/10838/how-to-get-Properties-and-methods-in-late-Binding P>
Vous devez les spécifier par nom à l'aide de Type.Invokemember (Nom de propriété, BindingFlags.getProperty, Binder, Cible, Args) Code> Parce qu'il n'y a aucun moyen de savoir quelles propriétés un objet obtenus auront à compiler le temps. Au lieu de cela, vous devez effectuer cette recherche à l'exécution, généralement via une comparaison de chaîne. P>
rcw.geproperties () code> ne fonctionnerait que si vous pouviez déterminer les propriétés et leurs emplacements au moment de la compilation. P>
Les deux autres réponses à partir de cette écriture sont correctes, mais elles manquent une opportunité importante d'expliquer comment la liaison tardive d'un objet COM regarde en termes du système de type .NET. Lorsque vous appelez Le type Si vous décompilez la méthode Vous pouvez em> utiliser .net réflexion sur le type em> interface em>. Par exemple, si vous savez que l'objet est une feuille de calcul Excel gettype code> sur l'objet COM, la valeur de retour est le type interne code> __ ComObject COOD>, pas le type d'interface COM que vous travaillez normalement lors de la rédaction de code INTEROP. em> Vous pouvez le voir dans le débogueur, ou avec un code comme
console.writeline (O.getType (). Nom); code>. p>.
__ comobject code> n'a pas de propriétés; C'est pourquoi vous obtenez un tableau vide lorsque vous appelez
O.getType (). getProperties () code>. (Au moins certaines choses dans la vie ont un sens!) P>
invoquant code>, vous constaterez qu'il possède une manipulation spéciale pour les objets COM, délégation de l'appel à une méthode native interne. Pour les objets "réguliers" .NET, la méthode utilise la réflexion "régulière" .NET, récupérant le
membreInfo code> pour le membre demandé et l'appelant. P>
code>, vous pouvez utiliser
typeof (feuille de calcul) .geproperties () code> et utiliser le procédentiaire "code> résultat" / code> instances avec votre objet. Si vous ne connaissez pas le type de l'objet au moment de la compilation, vous devez appeler
gettype () code>, comme dans votre code exemple. Dans ce cas, vous êtes bloqué par l'utilisation de
invoquant code>. P>