当前位置:  开发笔记 > 编程语言 > 正文

C#EmptyIfNull扩展,用于任何IEnumerable返回空派生类型

如何解决《C#EmptyIfNull扩展,用于任何IEnumerable返回空派生类型》经验,为你挑选了1个好方法。

假设nulls和空集合是等价的,我正在尝试为IEnumerable类型编写一个扩展方法,以返回派生类型的空集合而不是null.这样我就不必在整个地方重复进行空检查,而且我没有得到一个我必须强制转换的IEnumerable.

例如

List MethodReturningFooList()
{
...
}

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

这个扩展似乎有效,但有没有人看到任何陷阱?



1> Rob..:

是的,在这种情况下会破坏:

IEnumerable test = null;
var result = test.EmptyIfNull();

你可以这样解决:

public static class Extension
{
    public static List EmptyIfNull(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返回,并让用户投射它,或者提供过载,如上所示


@AlbertoMonteiro不,它打破了,因为类型是`IEnumerable `并且无法构造
推荐阅读
135369一生真爱_890
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有