假设我有以下课程:
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
应该返回什么?
最可接受的答案是标记它是否是解决方案。
答案 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
与所需类型来编写递归函数来横向层次结构。