由于它是一种扩展方法,因此即使链中的一个成员为空,它也能正常工作。您可以在空引用上调用扩展方法,因为它是方法调用的语法糖,其中对象作为参数传递。但是,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
条目,以免它们污染结果。这当然可以扩展到任何所需的逻辑。