3 Stimmen

Verwendung von Reflection mit COM Interop

Nach einem Interop-Aufruf erhalte ich ein COM-Objekt zurück. Ich weiß, dass dieses Objekt eine von drei möglichen COM-Klassen ist (Class1, Class2, Class3), aber ich weiß nicht, welche zur Laufzeit.

Die Reflexion über dieses Objekt (interopObject.GetType()) gibt den Basis-RCW-Wrapper von System.__ComObject.

Was ich brauche, ist, um einige Eigenschaften auf das Objekt zu setzen - Text1, Text2, ... Text30 (tatsächliche Namen, btw :)), die in allen drei Klassen existieren.

Also, die Frage ist, kann ich irgendwie den Laufzeittyp des Objekts (dies würde mein Problem lösen, aber möglicherweise unmöglich sein, da die .net-Laufzeit möglicherweise nicht diese Informationen haben), oder kann ich eine Eigenschaft eines COM-Objekts blind festlegen

Dies ist mein aktueller Code, der nicht funktioniert:

for ( int i = 1; i <= 30; i++ )
{
  ProprertyInfo pi =interopObject.GetType().GetProperty("Text" +i.ToString()) 
  // this returns null for pi
  pi.GetSetMethod().Invoke(interopObject, new object[] { someValue });
}

Dank Marc kommen diese drei in meine ständige Gimmicksammlung:

private static object LateGetValue(object obj, string propertyName)
{
  return RuntimeHelpers.GetObjectValue(NewLateBinding.LateGet(obj, null,
            propertyName, new object[0], null, null, null));
}

private static void LateSetValue(object obj, string propertyName, object value)
{
  NewLateBinding.LateSet(obj, null, propertyName, new []{value}, null, null);
}

private static void LateCallMethod(object obj, string methodName)
{
  NewLateBinding.LateCall(obj, null, methodName, new object[0], null,
            null, null, true);
}

8voto

Marc Gravell Punkte 970173

In C# 4.0, dynamic wäre ideal für diese Art der Enten-Typisierung.

Bis dahin frage ich mich, ob VB.Net nicht besser wäre, mit Option Strict Off um eine späte Bindung gegen object .

Schlimmstenfalls schreiben Sie es in VB.Net und verwenden dann Reflektor, um das C# für Sie zu schreiben ;-p

Hier ist ein Beispiel, das einen Verweis auf Microsoft.VisualBasic.dll erfordert, aber in C# gut funktioniert:

public static object GetValue(object obj, string propertyName)
{
    return RuntimeHelpers.GetObjectValue(NewLateBinding.LateGet(obj, null,
         propertyName, new object[0], null, null, null));
}

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X