反射:使用泛型参数调用方法

时间:2016-05-02 16:35:32

标签: c# generics reflection invoke

我是每个人,

我在使用反射调用方法时遇到了一些问题。

方法标志是

public T Create<T, TK>(TK parent, T newItem, bool updateStatistics = true, bool silent = false)
        where T : class
        where TK : class;
    public T Create<T, TK>(TK parent, string newName, Language language = null, bool updateStatistics = true, bool silent = false)
        where T : class
        where TK : class;

我想使用第二次重载。

我的代码是

typeof(ObjectType).GetMethod("Create")
            .MakeGenericMethod(new Type[] { typeof(Item), typeof(TKparent) })
            .Invoke(_objectInstance, new object[] { parent, name, _language, true, false });

其中Item是类,TKparent是类型变量,parent是TKparent实例。

我得到一个System.Reflection.AmbiguousMatchException。

我认为这个问题与泛型有关

我也尝试了这个:

typeof(ObjectType).GetMethod("Create", new Type[] { typeof(TKparent), typeof(string), typeof(Globalization.Language), typeof(bool), typeof(bool) })
            .MakeGenericMethod(new Type[] { typeof(Item), typeof(Tparent) })
            .Invoke(_objectInstance, new object[] { parent, name, _language, true, false });

但在这种情况下,我得到一个System.NullReferenceException(找不到方法)

任何人都可以帮忙解决这个问题,我生气了!

谢谢

1 个答案:

答案 0 :(得分:2)

问题是,GetMethod在您告诉它需要哪个重载之前,会先找到多个方法。允许您传入类型数组的GetMethod重载适用于非泛型方法,但由于参数是通用的,因此您无法使用它。

您需要致电GetMethods并过滤到您想要的那个:

var methods = typeof(ObjectType).GetMethods();

var method = methods.Single(mi => mi.Name=="Create" && mi.GetParameters().Count()==5);

method.MakeGenericMethod(new Type[] { typeof(Item), typeof(TKparent) })
      .Invoke(_objectInstance, new object[] { parent, name, _language, true, false });

如果你愿意,你可以明显地内联所有这些内容,但如果将它分成不同的行,它会使调试更容易。