0

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

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

PS如果问题不清楚,我可以添加更多细节。

4

2 回答 2

3

只需将结果转换为IList?

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

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


或者,但我不建议这样做,您始终可以假设该Add方法存在并使用动态鸭子类型:

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

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

于 2012-07-12T12:47:14.830 回答
1
MethodInfo methodInfo = t.GetMethod("Add");
result = methodInfo.Invoke(prop, parametersArray);
于 2012-07-12T12:49:08.520 回答