我有一个泛型类,带有泛型方法:
public class GenericClass<T> where T : class
{
public void GenericMethod<T>(T item)
{
// do work here
}
}
我还有一个具有多个属性的对象,其中一些属性可以是其他对象:
public class TestObject
{
public ChildObject ChildObject { get; set; }
}
然后我尝试使用一个泛型方法,该方法将通过TestObject反映并调用GenericMethod以获取自身内部属性的所有属性,例如ChildObject(我确实有一种方法可以根据继承来确定这一点,但是对于为了保持简单,不包括这个例子的代码):
public void ReflectingMethod<T>(T item)
{
var properties = item.GetType().GetProperties();
foreach (var property in properties)
{
var type = property.PropertyType;
dynamic propertyModel = property.GetValue(model, null);
var castedObject = Convert.ChangeType(propertyModel, type);
var genericClass = Activator.CreateInstance(typeof(GenericClass<>).MakeGenericType(type));
var method = genericClass.GetType().GetMethod("GenericMethod", new [] { type });
method.Invoke(castedObject, null);
}
}
问题在于我是否尝试更改属性的类型(如上例所示)或者我将属性直接传递给method.Invoke,例如:
method.Invoke(propertyModel, null);
我仍然收到同样的错误:
对象与目标类型不匹配。
在RunTime方法是:
GenericMethod(TestProject.ChildObject)
castedObject是:
TestProject.ChildObject
我很困惑为什么我会收到错误,当看起来那个被渲染的对象完全是该方法所寻找的类型时。
编辑1 包括我在发布问题时最初遗漏的GetValue调用。
答案 0 :(得分:0)
电话
method.Invoke(castedObject, null);
不正确。它应该是
method.Invoke(genericClass, new object[] { castedObject });
由于您尝试调用实例方法,因此Invoke(object, object[])的第一个参数必须是this
实例。对于静态方法,将null
作为第一个参数传递。方法参数始终通过object[]
方法的第二个Invoke
参数传递。