1

假设我有以下课程:

public class Xyz {
}

public class Abc: Xyz {
}

public class Pqr: Xyz {
}

public class Wtf: Abc {
}

使用一种方法来查找 type1 和 type2 的公共基类型:

public static Type FindBaseClassWith(this Type type1, Type type2);

然后,我使用以下方法调用该方法:

typeof(Wtf).FindBaseClassWith(variousType).FindBaseClassWith(typeof(Xyz));

variousType的变量在哪里Type,有时可能是null

并且FindBaseClassWith意味着被链接调用,如:

t1.FindBaseClassWith(t2).FindBaseClassWith(t3).FindBaseClassWith(t4);

找到它们之间的唯一基本类型。

该方法应该FindBaseClassWith返回什么?

一个最可接受的答案将是标记它是否是解决方案。

4

2 回答 2

2

由于它是一种扩展方法,因此即使链中的一个成员为空,它也能正常工作。您可以在空引用上调用扩展方法,因为它是方法调用的语法糖,其中对象作为参数传递。但是,NullReferenceException如果您尝试访问一个属性,如.Name结果为null.

如果您想使用链式调用来收集一系列参数,然后只在最后“处理”它们,您需要与 LINQ 类似的模式。中间类型应该是某种包装器,它只是收集链中的值。然后应该有一个最终调用,它实际上启动了匹配类型的过程,即类似.Resolve(). 这是一个名为的示例实现TypeChain

public class TypeChain
{
    private List<Type> types;

    public TypeChain(Type t)
    {
        types = new List<Type>();
        types.Add(t);
    }

    // searching for common base class (either concrete or abstract)
    public TypeChain FindBaseClassWith(Type typeRight)
    {
        this.types.Add(typeRight);
        return this;
    }

    public Type Resolve()
    {
        // do something to analyze all of the types
        if (types.All (t => t == null))
            return null;
        else
            types = types.Where (t => t != null).ToList();

        var temp = types.First();
        foreach (var type in types.Skip(1))
        {
            temp = temp.FindBaseClassWithHelper(type);
        }
        return temp;
    }
}

FindBaseClassWith静态实现会有一些变化:

// searching for common base class (either concrete or abstract)
public static Type FindBaseClassWithHelper(this Type typeLeft, Type typeRight)
{
    if(typeLeft == null || typeRight == null) return null;

    return typeLeft
            .GetClassHierarchy()
            .Intersect(typeRight.GetClassHierarchy())
            .FirstOrDefault(type => !type.IsInterface);
}

// searching for common base class (either concrete or abstract)
public static TypeChain FindBaseClassWith(this Type typeLeft, Type typeRight)
{
    return new TypeChain(typeLeft).FindBaseClassWith(typeRight);
}

使用上面的链接逻辑允许使用原始代码无法实现的逻辑场景。现在可以检查是否所有条目都是null,然后返回null,或者如果不是null,则在处理之前先清除所有null条目,以免它们污染结果。这当然可以扩展到任何所需的逻辑。

于 2013-01-16T15:20:57.947 回答
1

请参阅http://msdn.microsoft.com/en-us/library/system.type.basetype.aspx

BaseType您可以编写一个递归函数,通过反复与所需类型进行比较来跨越层次结构。

于 2013-01-16T14:30:47.583 回答