Return 与通用类型相同 Class

Return same Type as Generic Class

不太确定标题的措辞。

我想要实现的是 IEnumerable<T> 的深度克隆系统,其中 T:ICloneable

我已经编写了 as-yet 未经测试的方法,我认为下面的方法应该有效:

    public static IEnumerable<T> DeepClone<T>(this IEnumerable<T> source) where T:ICloneable
    {
        return source.Select(s => (T) s.Clone());
    }

然而,这个 return 是一个 IEnumerable<T>(正如人们所期望的那样),我很好奇是否有可能(不会造成不可接受的开销)到 return 的基本类型 IEnumerable<T> 而不是。

例如,运行 List<int>.DeepClone() 会 return 一个新的克隆 List<int> 而 运行 int[].DeepClone() 会 return一个新的克隆 int[].

我知道我可以很容易地在调用此方法后施放我的 IEnumerables,但我希望能够避免这种情况。

还有创建一整套重载的选项,每个重载一个IEnumerable,但如果可能的话,我想避免这种情况。

您需要为要支持的具体类型(列表、数组等)构建显式方法。

一个例子:

public static List<T> DeepClone<T>(this List<T> source) where T : ICloneable
{
    return source.Select(s => (T)s.Clone()).ToList();
}

或者,使用如下方法:

public static IEnumerable<T> DeepClone<T>(this IEnumerable<T> source) where T : ICloneable
{
    var result = source.Select(s => (T)s.Clone());

    if (source is List<T>)
    {
        return result.ToList();
    }

    return result;
}