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