【问题标题】:C# Invoke generic method with casted property as parameterC# 使用转换属性作为参数调用泛型方法
【发布时间】:2016-07-06 18:15:22
【问题描述】:

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

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为了简单起见,本示例中没有包含该代码):

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);

我仍然收到同样的错误:

对象与目标类型不匹配。

在运行时方法是:

GenericMethod(TestProject.ChildObject)

而 castedObject 是:

TestProject.ChildObject

我很困惑为什么我会收到我的错误,当看起来强制转换的对象正是该方法正在寻找的类型时。

编辑 1 包括我在发布问题时最初遗漏的对 GetValue 的调用。

【问题讨论】:

  • 不太清楚你在问什么。错误的原因很明显:property 是一个PropertyInfo 对象,没有理由期望它可以转换为属性返回 的类型。也许您打算先获得property.GetValue(item)?但在这种情况下,我认为您根本不需要致电Convert.ChangeType()。请提供一个良好的 minimal reproducible example 以可靠地重现您的问题,并准确描述代码的作用以及您希望它做什么。
  • 我很抱歉。在我尝试简化代码以便在此处发布时,我忘记包含对 GetValue 的调用。但是,我将 GetValue 用于动态对象,以便在转换之前获取实际对象。是的,您会认为我不需要强制转换对象,但是我这样做只是为了验证是否会发生相同的错误。

标签: c# generics reflection properties casting


【解决方案1】:

电话

  method.Invoke(castedObject, null);

不正确。应该是

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

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

【讨论】:

  • 谢谢!这正是我想要的。
猜你喜欢
  • 2011-09-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-05-24
  • 1970-01-01
  • 2021-03-17
  • 2017-12-31
  • 1970-01-01
相关资源
最近更新 更多