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[]
.
我知道我可以很容易地在调用此方法后施放我的 IEnumerable
s,但我希望能够避免这种情况。
还有创建一整套重载的选项,每个重载一个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;
}
不太确定标题的措辞。
我想要实现的是 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[]
.
我知道我可以很容易地在调用此方法后施放我的 IEnumerable
s,但我希望能够避免这种情况。
还有创建一整套重载的选项,每个重载一个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;
}