【问题标题】:“Object does not match target type” when calling generic method with reflection使用反射调用泛型方法时出现“对象与目标类型不匹配”
【发布时间】:2019-02-25 00:24:47
【问题描述】:

我搜索了几篇关于类似问题的不同帖子,但似乎没有一个能解决我的特定问题(尽管我相信它们离我不远了)。

下面的链接是最接近我的问题的版本

"Object does not match target type" when calling methods using string in C#

我的问题与链接中的问题之间的唯一区别是我调用的是泛型方法。

当我拨打电话时,我收到错误消息“对象与目标类型不匹配”,但类型,我可以说的完全匹配。 这是我重现问题的示例代码。

任何帮助将不胜感激

class Program
{
    static void Main(string[] args)
    {
        var obj = new SerializeObject();
        var serializer = new Serializer();


        var serialiserType = serializer.GetType();
        MethodInfo method = serialiserType.GetMethod("Deserialize");
        if (method == null)
        {
            return;
        }

        var t = obj.GetType();
        MethodInfo genericMethod = method.MakeGenericMethod(t);
        var tmp = genericMethod.Invoke(obj, new object[] { "Test" }); //error here
    }
}

public class Serializer
{
    public T Deserialize<T>(string value) where T : new()
    {
        return new T();
    }
}

public class SerializeObject
{

}

【问题讨论】:

  • 我会尝试先将字符串存储在一个变量中,然后再调用该方法(即用字符串变量名替换“Test”)忽略您是否已经尝试过。除此之外,我找不到任何大问题

标签: c# generics reflection


【解决方案1】:

documentation 声明第一个参数 obj 必须是您希望调用反射方法的实例:

对象对象

调用方法或构造函数的对象。如果 一个方法是静态的,这个参数被忽略。如果构造函数是 静态的,此参数必须为 null 或该类的实例 定义构造函数。

因此,我会将调用更改为以下内容:

var tmp = genericMethod.Invoke(serializer, new object[] { "Test" });

【讨论】:

  • 哇,我应该明白这一点。好答案
  • 好地方!谢谢!
猜你喜欢
  • 1970-01-01
  • 2013-10-06
  • 2018-10-28
  • 1970-01-01
  • 2011-10-15
  • 2017-06-17
  • 2017-04-10
  • 1970-01-01
相关资源
最近更新 更多