C#使用casted属性作为参数调用泛型方法

时间:2016-03-20 05:55:54

标签: c# generics reflection properties casting

我有一个泛型类,带有泛型方法:

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调用。

1 个答案:

答案 0 :(得分:0)

电话

  method.Invoke(castedObject, null);

不正确。它应该是

  method.Invoke(genericClass, new object[] { castedObject });

由于您尝试调用实例方法,因此Invoke(object, object[])的第一个参数必须是this实例。对于静态方法,将null作为第一个参数传递。方法参数始终通过object[]方法的第二个Invoke参数传递。