gpt4 book ai didi

c# - 将 .NET 库移植到 PCL 时如何解决缺少 ICloneable 接口(interface)的问题?

转载 作者:可可西里 更新时间:2023-11-01 07:44:44 29 4
gpt4 key购买 nike

我正在将现有的 .NET 类库移植到可移植类库。 .NET 库广泛使用 ICloneable接口(interface),不包括在可移植子集中。

通常,我在 .NET 类库中遇到这样的类定义:

public class Foo<T> where T : ICloneable
{
public void Bar(T item) {
var x = item.Clone();
...
}
}

如何才能将此代码成功移植到可移植类库?我是否必须重写 Clone方法调用,还是有侵入性较小的解决方法?

我不能简单地删除通用类型约束 where T : ICloneable因为那时 Bar方法将无法编译。

我可以写一个替换接口(interface)来代替 ICloneable在移植的代码中:

public interface IPCLCloneable {
object Clone();
}

只要我只实例化 Foo<T> 就可以工作具有实现 IPCLCloneable 的类,但它将不起作用,例如来自实现 ICloneable 的核心库的类型,例如 Array :

var x = new Foo<int[]>();  // Compilation error in PCL library

(为了完整起见,应该指出 ICloneable 接口(interface)在可移植子集核心库中没有明确实现,因为它不存在,但是 object Clone() 方法确实存在于可移植子集 Array 类中,并因此用于数组实现,例如 int[] 。)

我还有哪些其他选择?

最佳答案

ICloneable 是我们在设计 API 时犯错误的教科书示例。做深拷贝还是浅拷贝是不确定的,框架设计指南现在推荐not using it .

就是说,如果您无论如何都需要使用它,您可以通过在 PCL 中定义接口(interface)(具有完全相同的名称)来从 PCL 执行此操作,并且当您在具有 ICloneable 的平台上运行时,替换具有 ICloneable 定义的程序集,其类型指向“真实”版本。有关更多信息,请在此处查看我的回答:Is there any way I can implement IValidatableObject on Portable Class Library Project?

关于c# - 将 .NET 库移植到 PCL 时如何解决缺少 ICloneable 接口(interface)的问题?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20376466/

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