如果它们具有相同的约束,如何将两个T的类型视为相等?

时间:2014-09-01 14:51:26

标签: c# reflection

假设我有两种通用方法:

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

来做到这一点

2 个答案:

答案 0 :(得分:3)

查看foo.ParameterTypebar.ParameterType个实例的GenericParameterAttributes属性:它返回一个枚举,其中包含您类型的所有可能属性。

您有兴趣:

  • ReferenceTypeConstraint(如果您添加class作为约束)
  • NotNullableValueTypeConstraint(如果您添加struct作为约束)
  • DefaultConstructorConstraint(如果未与NotNullableValueTypeConstraint合并,则添加了new()作为约束)

答案 1 :(得分:0)

如果参数顺序很重要,您可以使用此方法:

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;
}