Używanie Reflection z COM Interop

Po wywołaniu międzyoperacyjnym otrzymuję obiekt COM. Wiem, że ten obiekt będzie jedną z trzech możliwych klas COM (Class1, Class2, Class3), ale nie wiem, który z nich jest w czasie wykonywania.

Refleksja nad tym obiektem (interopObject.GetType ()) zwraca podstawowy wrapper RCW System .__ ComObject.

Potrzebuję ustawić pewne właściwości obiektu - Text1, Text2, ... Text30 (rzeczywiste nazwy, btw :)), które istnieją we wszystkich trzech klasach.

Tak więc pytanie brzmi: czy mogę jakoś uzyskać typ obiektu wykonawczego (to rozwiązałoby mój problem, ale może być niemożliwe, ponieważ środowisko wykonawcze .net może nie mieć tej informacji), lub mogę ustawić właściwość obiektu COM ślepo

to jest mój obecny kod, który się nie udaje:

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

Dzięki Markowi te trzy rzeczy trafiają do mojej stałej kolekcji sztuczek:

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

questionAnswers(1)

yourAnswerToTheQuestion