C# 在COM互操作中使用反射

C# 在COM互操作中使用反射,c#,reflection,com,interop,C#,Reflection,Com,Interop,在一个互操作调用之后,我得到一个COM对象。 我知道这个对象将是三个可能的COM类(Class1、Class2、Class3)之一,但不知道在运行时是哪一个 对该对象的反射(interopObject.GetType())返回系统的基本RCW包装 我需要的是在对象上设置一些属性-Text1,Text2。。。Text30(实际名称,顺便说一下:)),它存在于所有三个类中 因此,问题是,我可以以某种方式获取对象的运行时类型(这可以解决我的问题,但可能不可能,因为.net运行时可能没有该信息),还是可

在一个互操作调用之后,我得到一个COM对象。 我知道这个对象将是三个可能的COM类(Class1、Class2、Class3)之一,但不知道在运行时是哪一个

对该对象的反射(interopObject.GetType())返回系统的基本RCW包装

我需要的是在对象上设置一些属性-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 });
}
在C#4.0中,
dynamic
非常适合这种类型的duck类型

在此之前,我不知道VB.Net是否会更好,使用
选项Strict Off
允许对
对象进行后期绑定

最坏的情况:在VB.Net中编写,然后使用reflector为您编写C#-p

下面是一个示例,它需要对Microsoft.VisualBasic.dll的引用,但在C#中没有问题:


不幸的是,代码将在明天到期,而不是秋天/冬天的某个时候:),而且VB也不是一个选项。是的,我确实需要鸭子输入一种(还)不支持它的语言…就像我说的;使用反射器获取C#,然后。。。我将尝试做一个例子。。。(2秒)尝试了NewLateBinding.LateGet魔术,现在似乎可以使用了。我很高兴。我又看了一些,我喜欢NewLateBinding类的动态。万岁,马克
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);
}
public static object GetValue(object obj, string propertyName)
{
    return RuntimeHelpers.GetObjectValue(NewLateBinding.LateGet(obj, null,
         propertyName, new object[0], null, null, null));
}