我需要从一个我不知道类型的对象中调用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&lt; T&GT;不会编译..
答案 0 :(得分:4)
你想要一个协变界面:
public interface IDeepCloneable<out T>
{
T DeepClone();
}
然后您可以转为IDeepCloneable<object>
。
答案 1 :(得分:2)
在C#4.0中,dynamic
关键字允许您通过暂停类型检查直到运行时来解决此问题:
dynamic x = GetObject();
var clone = x.DeepClone();
只要在DeepClone()
x
,就可以正常工作