【问题标题】:Calling method in generic way以通用方式调用方法
【发布时间】:2012-07-12 05:20:29
【问题描述】:

使用此代码,我可以通过名称获取某个对象的属性:

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(),这当然会触发编译错误。有什么方法可以在运行时独立于对象类型调用方法(当然要确保对象具有该方法)。

附:如果问题不清楚,我可以添加更多详细信息。

【问题讨论】:

    标签: c# .net collections types


    【解决方案1】:

    只需将结果转换为 IList?

    IList prop = (IList)p.GetValue(container, null);
    

    然后您将可以访问IList 成员。当然,这假设您是正确的,因为它们始终是IList,否则您将开始得到InvalidCastExceptions。


    或者,但我不建议这样做,您始终可以假设存在 Add 方法并使用动态鸭子类型:
    dynamic prop = p.GetValue(container, null);
    prop.Add("Foo");
    

    上述问题将在运行时使用 DLR 解决。它将尝试找到一个公共 Add 方法,该方法采用单个 string 参数。

    【讨论】:

    • 非常感谢,这正是我想要的,我的意思是 dynamic 关键字 :) 我对 .NET 没有丰富的经验,所以我什至不确定它是否可能或不是
    【解决方案2】:
    MethodInfo methodInfo = t.GetMethod("Add");
    result = methodInfo.Invoke(prop, parametersArray);
    

    【讨论】:

    • 谢谢你的回答,但亚当的回答更适合我:)
    猜你喜欢
    • 2012-06-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-30
    • 1970-01-01
    相关资源
    最近更新 更多