После вызова взаимодействия я возвращаю объект COM.
Я знаю, что этот объект будет одним из трех возможных классов COM (Class1, Class2, Class3), но я не знаю, какой из них во время выполнения.
Отражение для этого объекта (interopObject.GetType ()) возвращает базовую оболочку RCW System .__ ComObject.
Мне нужно установить некоторые свойства объекта - Text1, Text2, ... Text30 (реальные имена, кстати :)), которые существуют во всех трех классах.
Итак, вопрос в том, могу ли я каким-то образом получить тип объекта во время выполнения (это решило бы мою проблему, но может оказаться невозможным, поскольку среда выполнения .net может не иметь этой информации), или я могу установить свойство COM-объект вслепую
это мой текущий код, который не работает:
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 });
}
Благодаря Марку эти трое входят в мою коллекцию постоянных уловок:
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);
}