2

我需要从我不知道类型的对象中调用方法 DeepClone()。

object x = GetObject();
var x2 = x as IDeepCloneable< ?????? >;//What can I do here???
var clone = x2.DeepClone();

public interface IDeepCloneable<T>
{
    T DeepClone();
}

我试图创建一个新的“基础”接口并将“:IDeepCloneable”添加到泛型类中。

public interface IDeepCloneable
{
   object DeepClone();
}

但在这种情况下,我需要从 T DeepClone(); 更改派生接口的方法;到新的 T DeepClone();。结果,所有已经实现 IDeepCloneable<T> 的类都不会编译。

4

2 回答 2

4

你想要一个协变接口:

public interface IDeepCloneable<out T>
{
    T DeepClone();
}

然后,您可以投射到IDeepCloneable<object>.

于 2013-10-04T19:15:02.937 回答
2

在 C# 4.0 中,dynamic关键字允许您通过暂停类型检查直到运行时来解决此问题:

dynamic x = GetObject();
var clone = x.DeepClone();

只要有方法DeepClone()就可以正常工作x

于 2013-10-04T19:25:25.290 回答