我正在将现有的.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/

10-10 10:03