2015-12-21 23 views
0

我試圖確定當前類實現具有相同的簽名,我在獲得通過一個MethodInfo對象的任何方法。(其RealProxy有心計)比較通用的方法簽名平等

所以我實現此方法用於檢查是否兩個(可能是嵌套的,通用)類型相等:

Func<Type, Type, bool> checkTypesEqual = null; 
checkTypesEqual = (t1, t2) => 
{ 
    if (t1.IsGenericType && t2.IsGenericType) 
    { 
     if (t1.GetGenericTypeDefinition() != t2.GetGenericTypeDefinition()) 
      return false; 
     var t1args = t1.GetGenericArguments(); 
     var t2args = t2.GetGenericArguments(); 
     if (t1args.Length != t2args.Length) 
      return false; 
     for (int i = 0; i < t1args.Length; i++) 
     { 
      if (!checkTypesEqual(t1args[i], t2args[i])) 
       return false; 
     } 
     return true; 
    } 
    return t1 == t2; 
}; 

下面我檢查返回類型是相同的,並且所有的參數類型也是相同的。

現在,考慮下面的代碼:

var t11 = typeof (Task<Func<string, int>>); 
var t22 = typeof (Task<Func<string, int>>); 
bool eq = checkTypesEqual(t11, t22); 

eq將在此情況屬實,該方法的正常工作。

不過,如果你有,有一個泛型參數的方法,這將是更喜歡輸入以下內容:

var t11 = typeof (Task<Func<string, int>>); 
var t22 = typeof (Task<Func<string, T>>); 
bool eq = checkTypesEqual(t11, t22); 

現在,eq將是假的,因爲T != int,但該方法的簽名仍然匹配(有沒有通用約束)。我如何修改我的檢查類型方法來解決這個問題並返回true?

+0

既然沒有約束,T和int就是合規性,你不應該檢查不相關的(真/假)檢查類型嗎? – Turbot

回答

1

原來type.IsGenericParameter是我正在尋找的財產。所以我修改了這個方法,如下所示,來檢查一個類型是否是一個泛型參數,如果是,則返回true。

Func<Type, Type, bool> checkTypesEqual = null; 
checkTypesEqual = (t1, t2) => 
{ 
    if (t1.IsGenericParameter || t2.IsGenericParameter) // <------- 
     return true; 
    if (t1.IsGenericType && t2.IsGenericType) 
    { 
     if (t1.GetGenericTypeDefinition() != t2.GetGenericTypeDefinition()) 
      return false; 
     var t1args = t1.GetGenericArguments(); 
     var t2args = t2.GetGenericArguments(); 
     if (t1args.Length != t2args.Length) 
      return false; 
     for (int i = 0; i < t1args.Length; i++) 
     { 
      if (!checkTypesEqual(t1args[i], t2args[i])) 
       return false; 
     } 
     return true; 
    } 
    return t1 == t2; 
};