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;
}
我試過了,但是我得到了一個方法的'{Name =「T」FullName = null}', '{Name =「Messsage」FullName =「Core.Models.Message」}'用於其他。 – Matt
@Matt - [1]你是否在方法或返回類型上調用'GetGenericArguments()'?它看起來像你在返回類型上調用它,在另一種情況下是「任務」,而在另一種情況下是「任務」? [2]這兩種方法可能無法與你想象的方式相媲美。 'GetEntityById :long - >任務'是一個帶有開放泛型返回類型的「開放」泛型方法定義,而「GetMessage:long - >任務'是一個非泛型方法,具有封閉泛型返回類型。你需要對'GetEntityById'進行一次封閉的調用,使它們的返回類型相同。 –
smartcaveman
@smartcavman - 我很害怕這是事實。我會很樂意把它整理出來,因爲我想要做的事情是不可能的。謝謝你的幫助。 – Matt