编程语言
首页 > 编程语言> > c#-创建扩展方法以将类型包装为IEnumerables

c#-创建扩展方法以将类型包装为IEnumerables

作者:互联网

我想创建一个扩展方法,该方法可以有效地将单个对象包装为IEnumerables.这是为了避免最终在表达式中间放置新的[] {}的情况.使用以下方法很容易做到:

public static IEnumerable<TSource> WrapAsEnumerable<TSource>(this TSource source)
{
    return new[] { source };
}

问题在于,这将应用于任何类型和所有类型(这是预期的行为),但这也会产生使方法在IEnumerable< T>上可用的副作用.实例.在解析的扩展类型是IEnumerable< T>的情况下,我只想返回该IEnumerable< IEnumerable< IEnumerable< IEnumerable< IEnumerable< T>&gt ;,这并不是您真正期望的调用方法时.

本能地(也许是睡着了),我首先创建了一个看起来像这样的重载

public static IEnumerable<TSource> WrapAsEnumerable<TSource>(this IEnumerable<TSource> source)
{
    return source;
}

为了处理要包装的类型是IEnumerable T的情况,但是当然,控制流始终解析为第一种方法.

因此,问题是:如何创建这样的包装方法来处理扩展参数实例是IEnumerable< T>的情况.什么时候不呢?

解决方法:

这是另一种尝试,灵感来自埃里克·利珀特(Eric Lippert)的出色文章:https://stackoverflow.com/a/1451184/4955425.

您可以通过将两个扩展方法放在名称空间层次结构中的不同级别来控制重载分辨率.

namespace MyExtensions
{
    public static class HighPrecendenceExtensions
    {
        public static IEnumerable<TSource> WrapAsEnumerable<TSource>(this IEnumerable<TSource> source)
        {
            return source;
        }
    }

    namespace LowerPrecedenceNamespace
    {
        public static class LowPrecedenceExtensions
        {
            public static IEnumerable<TSource> WrapAsEnumerable<TSource>(this TSource source)
            {
                return new[] { source };
            }
        }
    }
}

但是,不利的一面是,您始终需要同时引用两个名称空间才能获得正确的方法调用行为.

using MyExtensions;
using MyExtensions.LowerPrecedenceNamespace;

标签:ienumerable,generics,extension-methods,c
来源: https://codeday.me/bug/20191028/1951025.html