IEnumerable <t>的扩展方法,它返回-this - </t>的类型

时间:2015-02-23 18:18:47

标签: c# ienumerable

就像我看到的那样,大多数IEnumerable扩展都会吞噬IEnumerable然后呕吐IEnumerable。是否有可能制作一个扩展方法,它可以吃任何IEnumerable(如List)然后返回相同的类型 - List?

例如,我想迭代集合,如果出错,我会抛出异常,但如果一切正常,我需要返回相同的实例(相同的类型)。

2 个答案:

答案 0 :(得分:3)

您需要使用两个通用参数:

public static TEnumerable Foo<TEnumerable, TItem>(this TEnumerable sequence)
    where TEnumerable: IEnumerable<TItem>
{
    return sequence;
}

请注意,由于此更改,您在调用此方法时无法推断通用参数;你必须明确指定它们。

答案 1 :(得分:2)

我不知道这样做有什么用处,但你可以像这样解决问题的泛型部分:

public static TEnumerable MyExtensionMethod<T, TEnumerable>(this TEnumerable enumerable)
    where TEnumerable : IEnumerable<T>
{
    ...
}

但是,您可能会发现很难实际实现这样的事情,因为没有通用的方法来创建您想要返回的TEnumerable

  

例如,我想迭代集合,如果出错,我会抛出异常,但如果一切正常,我需要返回相同的实例(相同的类型)。

以下扩展方法无法实现您真正想要的吗?我不明白你为什么要返回同一个实例。

public static void Consume<T>(this IEnumerable<T> enumerable)
{
    foreach (var item in enumerable)
    {
        // Do nothing
    }
}