在通用的方式调用方法
问题描述:
使用这个代码,我用它的名字得到一些对象的属性:在通用的方式调用方法
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.如果问题不清楚,我可以添加更多的细节。
答
或者,但我不会建议这一点,你总是可以使用动态使它的
只需将结果转换为IList
?您可以访问IList
的会员。当然,这假定你是正确的,他们总是IList
否则你会开始得到InvalidCastException
s。
或者,但我不会建议这一点,你总是可以使用动态使它的
Add
方法存在的假设和鸭式:
dynamic prop = p.GetValue(container, null);
prop.Add("Foo");
以上会在运行时使用的DLR解决。它将尝试查找采用单个string
参数的公开Add
方法。
答
MethodInfo methodInfo = t.GetMethod("Add");
result = methodInfo.Invoke(prop, parametersArray);
+0
谢谢你的回答,但亚当的回答更适合我:) – haynar 2012-07-12 13:03:07
非常感谢你,这正是我想要的,我的意思是'dynamic'关键字:)我没有与.NET一大经验,所以我甚至不知道是否有可能或不 – haynar 2012-07-12 13:02:25