【问题标题】:Using Reflection to call a method of a property使用反射调用属性的方法
【发布时间】:2011-07-19 18:43:51
【问题描述】:

我想要做的是调用属性的方法,使用反射。我有原始控件(一个 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

有人有什么建议吗?

谢谢

【问题讨论】:

  • 作为一个建议,如果您有兴趣通过反射更轻松地进行此类调用并且使用 C# 4,您可能希望将此反射功能包装在 DynamicObject 中。我在这里写了一篇关于如何做到这一点的帖子:mattmc3.blogspot.com/2011/03/…
  • 哦,我去看看,谢谢!

标签: c# .net reflection


【解决方案1】:

@acron,感谢您提供了一个很好的问题和答案。我想为未来的任何人扩展您的解决方案,以适应稍微不同的场景。

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

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

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

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

【讨论】:

    【解决方案2】:

    您收到的错误表明有问题的属性是只读的。没有定义 set 方法。如果没有 setter,您将无法设置属性的值。

    回复属性名称或更多上下文,我们或许可以为您提供更好的答案或替代方案。

    【讨论】:

    • 是的,我意识到这是因为没有二传手。我的代码只是我尝试过的一个例子。此外,该属性的名称在我的帖子中——ComboBox.Items。这是一个特定于 ComboBox 的 ObjectCollection。
    【解决方案3】:

    这很快...我将 Invoke 行更改为...

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

    ...它成功了:P

    【讨论】:

    • 我非常喜欢人们找到答案,然后发布他们如何解决自己的问题。我希望更多的人这样做。
    • 这种变化是如何起作用的?你能解释一下出了什么问题吗?
    • @PavanManjunath 我不完全确定我害怕。有可能我通过隐式转换为objectGetValue 的结果装箱,Invoke 无法取消装箱。
    猜你喜欢
    • 1970-01-01
    • 2016-06-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多