gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 15:25:40 25 4
gpt4 key购买 nike

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

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

问题是这将应用于任何和所有类型(这是预期的行为),但这也会产生使该方法在 IEnumerable <T> 上可用的副作用。实例。在解析的扩展类型是 IEnumerable<T> 的情况下,我只想返回这个 IEnumerable,因为替代方案是用 IEnumerable<IEnumerable<T>> 找到自己,这并不是您在调用该方法时所期望的。

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

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

为了处理要包装的类型是 IEnumerable<T> 的情况, 但是当然,控制流总是解析到第一种方法。

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

最佳答案

这是另一个尝试,灵感来自 Eric Lippert 的精彩帖子:https://stackoverflow.com/a/1451184/4955425 .

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

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;

关于c# - 创建扩展方法以将类型包装为 IEnumerables,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30629356/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com