假设nulls和空集合是等价的,我正在尝试为IEnumerable类型编写一个扩展方法,以返回派生类型的空集合而不是null.这样我就不必在整个地方重复进行空检查,而且我没有得到一个我必须强制转换的IEnumerable.
例如
ListMethodReturningFooList() { ... } Foo[] MethodReturningFooArray() { ... } void Bar() { List list = MethodReturningFooList().EmptyIfNull(); Foo[] arr = MethodReturningFooArray().EmptyIfNull(); } public static class Extension { public static T EmptyIfNull (this T iEnumerable) where T : IEnumerable, new() { var newTypeFunc = Expression.Lambda >(Expression.New(typeof(T))).Compile(); return iEnumerable == null ? newTypeFunc() : iEnumerable; } }
这个扩展似乎有效,但有没有人看到任何陷阱?
是的,在这种情况下会破坏:
IEnumerabletest = null; var result = test.EmptyIfNull();
你可以这样解决:
public static class Extension { public static ListEmptyIfNull (this List list) { return list ?? new List (); } public static T[] EmptyIfNull (this T[] arr) { return arr ?? new T[0]; } public static IEnumerable EmptyIfNull (this IEnumerable enumerable) { return enumerable ?? Enumerable.Empty (); } }
您需要重载以确保返回相同的集合类型(与以前一样).
这是一个通过返回相同的集合类型无法工作的案例:
public abstract class MyAbstractClass : IEnumerable{ private List tempList = new List (); public IEnumerator GetEnumerator() { return tempList.GetEnumerator(); } IEnumerator IEnumerable .GetEnumerator() { return tempList.GetEnumerator(); } } MyAbstractClass myClass = null; MyAbstractClass instance = myClass.EmptyIfNull();
MyAbstractClass
在不知道子类的情况下,我们无法返回此处.并且使用空引用,没有猜测就不可能.此外,当类没有默认构造函数时会发生什么?进入危险的领域.
您需要拥有全能IEnumerable
返回,并让用户投射它,或者提供过载,如上所示