Verwenden 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 sein wird (Class1, Class2, Class3), weiß aber nicht, welche in der Laufzeit.

Die Reflexion über dieses Objekt (interopObject.GetType ()) gibt den Basis-RCW-Wrapper von System .__ ComObject zurück.

Ich muss einige Eigenschaften für das Objekt festlegen - Text1, Text2, ... Text30 (tatsächliche Namen, Übrigens :)), die in allen drei Klassen vorhanden sind.

Die Frage ist also, ob ich den Laufzeit-Typ des Objekts irgendwie ermitteln kann (dies würde mein Problem lösen, ist aber möglicherweise unmöglich, da die .NET-Laufzeit möglicherweise nicht über diese Informationen verfügt) oder ob ich eine Eigenschaft eines COM-Objekts festlegen kann blindlings

Dies ist mein aktueller Code, der fehlschlägt:

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 gehören diese drei in meine permanente Gimmicks-Sammlung:

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

Antworten auf die Frage(1)

Ihre Antwort auf die Frage