`FindBaseClassWith`方法应该返回什么?

时间:2013-01-16 14:26:03

标签: c# inheritance types

假设我有以下课程:

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

variousTypeType的变量,有时可能是null

并且FindBaseClassWith意味着被链式调用:

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

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

方法FindBaseClassWith应该返回什么?

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

2 个答案:

答案 0 :(得分: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个条目,这样它们就可以了不要污染结果。当然,这可以扩展到任何所需的逻辑。

答案 1 :(得分:1)

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

您可以通过反复比较BaseType与所需类型来编写递归函数来横向层次结构。