如何在将.NET库移植到PCL时解决缺少ICloneable接口的问题?

And*_*son 15 c# generics interface icloneable portable-class-library

我正在将现有的.NET类库移植到可移植类库..NET库广泛使用ICloneable接口,该接口未包含在可移植子集中.

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

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

如何将此代码成功移植到可移植类库中,我该怎么办?我是否必须重写Clone方法调用,或者是否有较少侵入性的解决方法?

我不能简单地删除泛型类型约束,where T : ICloneable因为该Bar方法将无法编译.

我可以编写一个替换接口来代替ICloneable在移植代码中使用:

public interface IPCLCloneable {
    object Clone();
}
Run Code Online (Sandbox Code Playgroud)

只要我只实现Foo<T>了实现的类,这就可以工作IPCLCloneable,但是它不能用于实现的核心库中的类型ICloneable,例如Array:

var x = new Foo<int[]>();  // Compilation error in PCL library
Run Code Online (Sandbox Code Playgroud)

(为了完整起见,应该指出ICloneable接口未在可移植子集核心库中显式实现,因为它不存在,但该object Clone()方法确实存在于可移植子集Array类中,因此对于数组实现,例如int[].)

我还有其他选择吗?

Dan*_*ted 13

ICloneable是一种教科书的例子,说明我们在设计API时犯了错误.它是深层还是浅层是未定义的,现在框架设计指南建议不要使用它.

也就是说,无论如何你需要使用它,你可以通过在PCL中定义接口(具有完全相同的名称)从PCL执行此操作,并且当您在具有ICloneable的平台上运行时,用以下内容替换程序集: ICloneable定义,其中一个类型转发到"真实"版本.请参阅我的答案以获取更多信息:有什么办法可以在Portable Class Library Project上实现IValidatableObject吗?