1

我在这里有一个很酷的方法检查一个类型是否是从另一个派生的。当我重构代码时,我得到了这个块GetBlah

public static bool IsOf(this Type child, Type parent)
{
    var currentChild = child.GetBlah(parent);

    while (currentChild != typeof(object))
    {
        if (parent == currentChild)
            return true;

        if(currentChild.GetInterfaces().Any(i => i.GetBlah(parent) == parent))
            return true;

        if (currentChild.BaseType == null)
            return false;

        currentChild = currentChild.BaseType.GetBlah(parent);
    }

    return false;
}

static Type GetBlah(this Type child, Type parent)
{
    return child.IsGenericType && parent.IsGenericTypeDefinition 
         ? child.GetGenericTypeDefinition() 
         : child;
}

我无法理解是什么GetBlah,因此无法给它一个正确的名称。我的意思是我可以理解三元表达式和GetGenericTypeDefinition函数,但我似乎没有在IsOf方法中使用它,尤其parent是正在传递的参数。有人可以阐明该GetBlah方法实际返回的内容吗?

奖励:建议我为该方法取一个合适的名称:)

4

1 回答 1

3

泛型类型类似于List<int>or List<string>。它们都使用相同的泛型类型定义:List<>.

IsGenericType将返回true的类型是泛型类型。如果类型是泛型类型定义IsGenericTypeDefinition应该返回true。该函数GetGenericTypeDefinition将返回泛型类型的泛型类型定义。

所以,如果你愿意:

typeof(List<int>).GetGenericTypeDefinition();

你会得到typeof(List<>).

理论到此为止!

如果正确分析您的代码,它将返回 truechild来自parent. 所以我做了一个小清单,列出了应该返回哪种类型的组合true(在我看来):

A: int, IComparable<int>
B: int, ValueType
C: int, object
D: List<int>, IList<int>
E: List<int>, IEnumerable<int>
F: List<int>, object

G: List<int>, List<>
H: List<int>, IList<>
I: List<>, IList<>
J: List<>, object

给定的代码在某一点失败:每次当parent类型为objectfalse 时,都会返回 false。这很容易通过将您的 while-condition 修改为:

while (currentChild != null)

现在到你的Blah-function。所做的是检查父级是否是泛型类型定义。没有“普通”类(泛型或非泛型)可以从泛型类型定义派生。只有泛型类型定义可以派生自另一个泛型类型定义。因此,为了让案例 G 和 H 为真,必须进行特殊的转换。如果父级是泛型类型定义并且当子级可以转换为泛型类型定义时,则子级将转换为其泛型类型定义。

这就是它所做的一切。

因此,您的功能的完美名称可能是:ConvertChildToGenericTypeDefinitionIfParentIsAGenericTypeDefinitionAndTheChildIsAGenericType(...)

:)

于 2013-05-09T22:51:46.763 回答