比较泛型方法签名的相等性
本文关键字:泛型方法 比较 | 更新日期: 2023-09-27 18:27:36
我正在尝试确定当前类是否实现了与我传入的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);
现在,由于T != int
,eq
将为false,但方法签名仍然匹配(没有通用约束)。我如何修改我的支票类型方法来说明这一点并返回true?
原来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;
};