【问题标题】:Compare generic method signature equality比较泛型方法签名相等
【发布时间】:2015-12-21 11:05:00
【问题描述】:

我正在尝试确定当前类是否实现了与我传入的 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 将为 false,因为 T != int,但方法签名仍然匹配(没有通用约束)。如何修改我的检查类型方法以解决此问题并返回 true?

【问题讨论】:

  • 由于没有约束,T 和 int 是合规的,你不应该检查不相关(真/假)检查的类型吗?

标签: c# .net generics


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 2011-01-15
    • 2013-06-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-13
    • 1970-01-01
    相关资源
    最近更新 更多