如何对待两种类型的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方法来比较类型,但我也想检查classstructnew()约束。使用Reflection有办法做到这一点吗?

如何对待两种类型的T';s相等,如果它们具有相同的约束

查看foo.ParameterTypebar.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;
}