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吗?