我正在将现有的.NET类库移植到可移植类库。 .NET库大量使用了ICloneable接口(interface),该接口(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/