2009-07-21 128 views
3

互操作調用後,我找回一個COM對象。 我知道這個對象將是三個可能的COM類(Class1,Class2,Class3)之一,但不知道在運行時是哪一個。在COM互操作中使用反射

該對象的反射(interopObject.GetType())返回System .__ ComObject的基本RCW包裝。

我需要的是在對象上設置一些屬性 - Text1,Text2,... Text30(實際名稱,btw :)),它們存在於所有三個類中。因此,問題是,我可以以某種方式獲得對象的運行時類型(這可以解決我的問題,但可能不可能,因爲.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); 
} 

回答

7

在C#4.0中,dynamic將是此類鴨子打字的理想選擇。

在此之前,我想知道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)); 
} 
+0

Unfortunalely,代碼明天到期,在秋/冬無有時:) 並且還,VB是不是一種選擇。 是的,我確實需要用一種不支持它的語言進行鴨子打字...... – SWeko 2009-07-21 20:57:14