如何对待两种类型的T';s相等,如果它们具有相同的约束
本文关键字:如果 约束 相等 两种 类型 | 更新日期: 2023-09-27 18:20:17
假设我有两个通用方法:
static void Foo<T>(T argument) { }
static void Bar<T>(T argument) { }
以下代码返回false,因为两个T
属于不同的类型,并且它们可能具有不同的约束:
var flags = BindingFlags.Static | BindingFlags.NonPublic;
var foo = typeof (Program).GetMethod("Foo", flags)bar.GetParameters()[0];
var bar = typeof(Program).GetMethod("Bar", flags)foo.GetParameters()[0];
bool test = foo.ParameterType == bar.ParameterType; // false
我想写一个方法,根据两个T
的约束来比较它们,如果它们有相同的约束,则返回true。例如,上面的结果应该为true,因为这两个参数都没有任何约束。
我可以使用GetGenericParameterConstraints
方法来比较类型,但我也想检查class
、struct
和new()
约束。使用Reflection
有办法做到这一点吗?
查看foo.ParameterType
和bar.ParameterType
实例的GenericParameterAttributes
属性:它返回一个枚举,其中包含类型的所有可能属性。
你会感兴趣的:
ReferenceTypeConstraint
(如果添加了class
作为约束)NotNullableValueTypeConstraint
(如果添加了struct
作为约束)DefaultConstructorConstraint
(如果未与NotNullableValueTypeConstraint
组合,则添加new()
作为约束)
如果参数的顺序很重要,可以使用此方法:
private static bool CompareGenerics(MethodInfo m1, MethodInfo m2)
{
var args1 = m1.GetGenericArguments();
var args2 = m2.GetGenericArguments();
if (args1.Length != args2.Length)
return false;
for (int i = 0; i < args1.Length; i++)
{
if ((args1[i].GenericParameterAttributes ^ args2[i].GenericParameterAttributes) != 0)
return false;
}
return true;
}