返回与Generic Class相同的Type

时间:2017-06-26 10:23:13

标签: c# generics casting extension-methods

我真的不确定如何标题。

我想要实现的是IEnumerable<T>的{​​{1}}深度克隆系统。

我已经编写了一个尚未经过测试的方法,我认为该方法应该可行:

T:ICloneable

然而,这会返回一个 public static IEnumerable<T> DeepClone<T>(this IEnumerable<T> source) where T:ICloneable { return source.Select(s => (T) s.Clone()); } (正如人们所期望的那样),我很好奇是否可以(不会导致不可接受的开销)返回IEnumerable<T>的基本类型代替。

例如,运行IEnumerable<T>会返回一个新的克隆List<int>.DeepClone(),正在运行的List<int>会返回一个新的,克隆的int[].DeepClone()

我知道在调用此方法后我可以很容易地投出int[],但我希望能够避免这种情况。

还可以选择创建一整套重载,每个IEnumerable一个,但如果可以,我可以避免这种情况。

1 个答案:

答案 0 :(得分:1)

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

一个例子:

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