使用Reflection调用属性的方法

时间:2011-03-21 15:21:03

标签: c# .net reflection

我要做的是使用Reflection调用属性的方法。我有原始的Control(一个ComboBox),属性的PropertyInfo(ComboBox.Items)和方法的名称(ComboBox.Items.Add)。我已经尝试了下面的代码来获取,更改,设置但它不起作用,因为Items没有setter。

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

有人有任何建议吗?

由于

3 个答案:

答案 0 :(得分:15)

那很快......我将Invoke行改为......

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

......它有效:P

答案 1 :(得分:5)

@acron,感谢您提供了一个很棒的问题和答案。我希望为未来的任何人扩展您的解决方案以适应略有不同的情况。

面对ASP.NET世界中的类似问题,我试图找到一种加载 System.Web.UI.Webcontrols.DropDownList System.Web的常用方法。 UI.HtmlControls.HtmlSelect 虽然它们都具有类型为“ListItemCollection”的“Items”属性,并且具有相应的“Add”方法,但它们不共享公共接口(,因为它们应该......嘿微软... )以便可以使用强制转换。

您的解决方案未提供的额外挑战是Add方法的重载。

没有重载您的行: MethodInfo m = p.PropertyType.GetMethod(methodName); 工作得很好。但是,当重载Add方法时,会调用另一个参数,以便运行时可以识别要调用的重载。

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

答案 2 :(得分:1)

您收到的错误表明相关媒体资源是只读的。没有定义set方法。如果没有setter,您将无法设置该属性的值。

使用房产名称或更多背景信息回复,我们可以为您提供更好的答案或替代方案。