Usando Reflexão com Interoperabilidade COM
Depois de uma chamada de interoperabilidade, recebo um objeto COM. Eu sei que este objeto será um dos três possíveis COM classes (Class1, Class2, Class3), mas não sei qual deles em tempo de execução.
A reflexão sobre esse objeto (interopObject.GetType ()) retorna o wrapper RCW base do System .__ ComObject.
O que eu preciso é definir algumas propriedades no objeto - Texto1, Texto2, ... Texto30 (nomes reais, btw :)), que existem em todas as três classes.
Então, a questão é, posso de alguma forma obter o tipo de tempo de execução do objeto (isso resolveria meu problema, mas poderia ser impossível, pois o tempo de execução do .net pode não ter essa informação) ou posso definir uma propriedade de um objeto COM cegamente
este é o meu código atual, que falha:
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 });
}
Graças a Marc, esses três vão na minha coleção de truques permanentes:
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);
}