Вопрос по reflection, interop, c#, com – Использование Reflection с COM Interop

3

После вызова взаимодействия я возвращаю объект 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);
}

Ваш Ответ

1   ответ
7

В C # 4.0dynamic было бы идеально для этого типа утки.

До тех пор, я думаю, что VB.Net будет лучше, сOption Strict Off допустить позднее связывание сobject.

В худшем случае: запишите это в VB.Net, затем используйте рефлектор, чтобы написать C # для вас ;-p

Вот пример, который требует ссылки на Microsoft.VisualBasic.dll, но подходит для C #:

public static object GetValue(object obj, string propertyName)
{
    return RuntimeHelpers.GetObjectValue(NewLateBinding.LateGet(obj, null,
         propertyName, new object[0], null, null, null));
}
Как я и сказал; используйте рефлектор для получения C #, затем ... я попытаюсь сделать пример ... (2 секунды)
Проверено еще немного, и мне нравится динамика класса NewLateBinding. Всем привет Марк SWeko
Пробовал магию NewLateBinding.LateGet, и, похоже, пока работает. Я счастлив. SWeko
К сожалению, код должен появиться завтра, а не когда-нибудь осенью / зимой :) А также, VB не вариант. И да, мне нужна утка на языке, который (пока) не поддерживает это ... SWeko

Похожие вопросы