以通用方式调用方法

时间:2012-07-12 12:45:37

标签: c# .net collections types

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

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

P.S。如果问题不明确,我可以添加更多细节。

2 个答案:

答案 0 :(得分:3)

只需将结果投射到IList

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

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

<小时/> 或者,但我不建议这样做,你总是可以假设Add方法存在,并使用动态对其进行鸭式输入:

dynamic prop = p.GetValue(container, null);
prop.Add("Foo");

以上将使用DLR在运行时解决。它会尝试查找采用单个Add参数的公共string方法。

答案 1 :(得分:1)

MethodInfo methodInfo = t.GetMethod("Add");
result = methodInfo.Invoke(prop, parametersArray);