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