2016-03-26 61 views
2

好的,問題來了。比較兩種不同方法的返回類型時遇到問題。如何獲得給定方法的通用參數類型

第一種方法是硬編碼到一個特定的泛型類型,所以當你獲得關於方法返回類型的信息時,它包含了類型。這是我的意思。

public Task<Message> GetMessage(long id) 
{ 
    ... 
    return await getEntityFromDbById<Message>(id); //generic type is hard coded to type Message 
} 

如果你得到的方法信息this.GetType().GetTypeInfo().GetDeclaredMethod("GetMessage").ReturnType.ToString(),看它的返回類型,這就是你得到

System.Threading.Tasks.Task`1[Core.Models.Message] 

現在,我的第二個方法是通用的,看起來是這樣的。

public Task<T> GetEntityById<T>(long id) where T : class, IEntity 
{ 
    ... 
    return await getEntityFromDbById<T>(id); // generic type is passed in 
} 

現在,如果你得到此方法的返回類型的信息你

System.Threading.Tasks.Task`1[T] 

我試圖在運行時做的,是得到T類型的信息,並將它與其他方法只使用MethodInfo類型。這怎麼辦?

public bool compareMethods(MethodInfo method1, MethodInfo method2) 
{ 
    ... 
    //Won't work because one method has a generic return type. 
    //How do you detect and compare?  
    return method1.ReturnType == method2.ReturnType; 
} 

回答

1

給定類型的參考,可以通過使用該方法GetGenericArguments()這將返回類型引用數組爲通用參數訪問的引用一般類型參數的信息的類型。

MethodInfo上定義了相同的方法。由於在聲明中只有一個通用參數,所以實際上只需寫入:

public bool compareMethods(MethodInfo method1, MethodInfo method2) 
{ 
    return method1.GetGenericArguments()[0] == method2.GetGenericArguments()[0]; 
} 
+0

我試過了,但是我得到了一個方法的'{Name =「T」FullName = null}', '{Name =「Messsage」FullName =「Core.Models.Message」}'用於其他。 – Matt

+1

@Matt - [1]你是否在方法或返回類型上調用'GetGenericArguments()'?它看起來像你在返回類型上調用它,在另一種情況下是「任務」,而在另一種情況下是「任務」? [2]這兩種方法可能無法與你想象的方式相媲美。 'GetEntityById :long - >任務'是一個帶有開放泛型返回類型的「開放」泛型方法定義,而「GetMessage:long - >任務'是一個非泛型方法,具有封閉泛型返回類型。你需要對'GetEntityById'進行一次封閉的調用,使它們的返回類型相同。 – smartcaveman

+0

@smartcavman - 我很害怕這是事實。我會很樂意把它整理出來,因爲我想要做的事情是不可能的。謝謝你的幫助。 – Matt

相關問題