8
votes

Réflexion sur les objets Interop

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);
}


0 commentaires

3 Réponses :


4
votes

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.

Voici quelques bons articles sur le sujet:

http://support.microsoft.com/default. ASPX? SCID = KB; FR-US; Q302902

http: // www.codeproject.com/articles/10838/how-to-get-Properties-and-methods-in-late-Binding


0 commentaires

2
votes

Vous devez les spécifier par nom à l'aide de Type.Invokemember (Nom de propriété, BindingFlags.getProperty, Binder, Cible, Args) 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.

rcw.geproperties () ne fonctionnerait que si vous pouviez déterminer les propriétés et leurs emplacements au moment de la compilation.


0 commentaires

18
votes

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 gettype sur l'objet COM, la valeur de retour est le type interne __ ComObject , pas le type d'interface COM que vous travaillez normalement lors de la rédaction de code INTEROP. Vous pouvez le voir dans le débogueur, ou avec un code comme console.writeline (O.getType (). Nom); . .

Le type __ comobject n'a pas de propriétés; C'est pourquoi vous obtenez un tableau vide lorsque vous appelez O.getType (). getProperties () . (Au moins certaines choses dans la vie ont un sens!)

Si vous décompilez la méthode invoquant , 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 pour le membre demandé et l'appelant.

Vous pouvez utiliser .net réflexion sur le type interface . Par exemple, si vous savez que l'objet est une feuille de calcul Excel , vous pouvez utiliser typeof (feuille de calcul) .geproperties () 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 () , comme dans votre code exemple. Dans ce cas, vous êtes bloqué par l'utilisation de invoquant .


0 commentaires