繁体   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