gpt4 book ai didi

用于克隆 IList 的 C# 通用扩展方法

转载 作者:太空宇宙 更新时间:2023-11-03 10:46:42 24 4
gpt4 key购买 nike

我在制作用于克隆列表的扩展方法时遇到问题。

answer非常接近,提供如下扩展方法:

static class Extensions
{
public static IList<T> Clone<T>(this IList<T> listToClone) where T: ICloneable
{
return listToClone.Select(item => (T)item.Clone()).ToList();
}
}

这里的问题是 ToList() 返回一个 List 类型的对象,这不一定是我用来调用函数的对象。我希望它返回一个与我在其上调用 Clone 的对象类型相同的对象。

我能得出的最接近的结果是:

static private object Clone<T, K>(this T container)
where T : IList<K>, new()
where K : ICloneable
{
T res = new T();

int size = container.Count;
for (int i = 0; i < size; ++i)
{
K obj = container[i];
res.Add((K)obj.Clone());
}

return res;
}

但我不断收到 CS1061 错误(不包含“克隆”的定义,并且没有扩展方法“克隆”接受类型为 [...] 的第一个参数可以找到...)。除非我指定:

List<CloneableType> clone = myList.Clone<List<CloneableType>, CloneableType>();

有没有一种方法可以在没有规范的情况下简单地调用 Clone() ?为什么编译器不能推断出我想要的类型?

注意:虽然该示例使用了通用 List,但对我来说重要的是它也适用于 IList 的非 List 实现。

最佳答案

C# 编译器从参数中推断泛型类型,但您的方法中没有 K 类型的参数。

作为替代方案,您可以使用以下方法:

static class Extensions
{
public static IList<T> Clone<T>(this IList<T> listToClone)
where T : ICloneable
{
var list = (IList<T>)Activator.CreateInstance(listToClone.GetType());
foreach (var item in listToClone)
{
list.Add((T)item.Clone());
}
return list;
}
}

注意:

  • 这可能会在运行时失败(列表类型没有公共(public)无参数构造函数——不太可能)
  • 您仍然需要将结果转换为原始类型

您可能想考虑使用序列化作为深度克隆对象的替代方法。

关于用于克隆 IList 的 C# 通用扩展方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23101860/

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