2016-05-02 99 views
4

大家好,反思:調用一個具有泛型參數的方法

我在調用帶反射的方法時遇到了一些問題。

方法標識是

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

其中項目是一個類,TKparent是一種類型的可變和父是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(找不到方法)

誰能幫助有了這個,我生氣了!

謝謝

回答

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

,但如果你把它分解爲單獨的線也使得調試更加容易。

相關問題