簡體   English   中英

使用反射調用屬性的方法

[英]Using Reflection to call a method of a property

我想做的是使用Reflection調用屬性的方法。 我有原始的Control(一個ComboBox),屬性的PropertyInfo(ComboBox.Items)和方法的名稱(ComboBox.Items.Add)。 我嘗試了下面的代碼來獲取,更改,設置,但由於Items沒有設置器,所以它不起作用。

PropertyInfo p  = controlType.GetProperty(propertyName); // gets the property ('Items')
MethodInfo m    = p.PropertyType.GetMethod(methodName); // gets the method ('Items.Add')
object o        = p.GetValue(newControl, null);         // gets the current 'Items'

m.Invoke(o, new object[] { newValue });                 // invokes 'Add' which works
p.SetValue(newControl, o, null);                         // exception: 'Items' has no setter

有人有建議嗎?

謝謝

很快...我將Invoke行更改為...

m.Invoke(p.GetValue(newControl, null), new object[] { newValue });

...而且有效:P

@acron,感謝您提供了很好的問答。 我想將您的解決方案擴展到稍有不同的方案,以供將來使用的任何人使用。

面對ASP.NET世界中的類似問題,我試圖找到一種加載System.Web.UI.Webcontrols.DropDownListSystem.Web.UI.HtmlControls.HtmlSelect的通用方法,盡管這兩個方法都有一個“ Items類型為“ ListItemCollection”的屬性,以及相應的“添加”方法,它們不共享公共接口( 因為它們應該...嘿Microsoft ... ),因此可以使用強制轉換。

您的解決方案沒有提供的其他挑戰是Add方法的重載。

沒有過載,您的行: MethodInfo m = p.PropertyType.GetMethod(methodName); 效果很好。 但是,當Add方法重載時,將調用附加參數,以便運行時可以識別要調用的重載。

MethodInfo methInfo = propInfo.PropertyType.GetMethod("Add", new Type[] { typeof(ListItem) });

您收到的錯誤表明所討論的屬性是只讀的。 沒有定義set方法。 沒有設置器,您將無法設置屬性的值。

回傳屬性名稱或更多上下文,我們也許可以為您提供更好的答案或替代方案。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM