2012-07-12 33 views
0

使用這個代碼,我用它的名字得到一些對象的屬性:在通用的方式調用方法

string propName = "Buttons"; // getting this runtime 
Type t = container.GetType(); 
PropertyInfo p = t.GetProperty(propName); 
object prop = p.GetValue(container, null); 

屬性的類型取決於屬性名稱,但所有屬性已經實現了IList接口,因此,所有的他們有Add()方法。現在我想能夠使用此方法將元素添加到該屬性。但我不能在object類型上調用此方法。我需要以某種方式投射它的運行時間,但在此之前,我不得不以某種方式使用prop.Add(),這當然會觸發編譯錯誤。有沒有辦法在運行時獨立於對象類型調用一個方法(當然要確保該對象具有該方法)。

P.S.如果問題不清楚,我可以添加更多的細節。

回答

3

只需將結果轉換爲IList?您可以訪問IList的會員。當然,這假定你是正確的,他們總是IList否則你會開始得到InvalidCastException s。


或者,但我不會建議這一點,你總是可以使用動態使它的 Add方法存在的假設和鴨式:

dynamic prop = p.GetValue(container, null); 
prop.Add("Foo"); 

以上會在運行時使用的DLR解決。它將嘗試查找採用單個string參數的公開Add方法。

+0

非常感謝你,這正是我想要的,我的意思是'dynamic'關鍵字:)我沒有與.NET一大經驗,所以我甚至不知道是否有可能或不 – haynar 2012-07-12 13:02:25

1
MethodInfo methodInfo = t.GetMethod("Add"); 
result = methodInfo.Invoke(prop, parametersArray); 
+0

謝謝你的回答,但亞當的回答更適合我:) – haynar 2012-07-12 13:03:07