2013-10-04 21 views
2

我需要从不知道类型的对象调用DeepClone()方法。如何转换为未知类型,需要转换为GenericType,但T未知

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>将无法编译..

+1

如果你是NET 4.0,你可以使用'dynamic'来代替 – Mgetz

+0

@Mgetz不是真的... – Servy

+0

@Servy我已经完成了它...也可以使用[Type.MakeGenericType](http://msdn.microsoft.com /en-us/library/system.type.makegenerictype.aspx)在这里...它可以让你做一个专业化的生成ic在运行时并将其分配给动态。 – Mgetz

回答

4

你想要一个协接口:

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

然后可以转换为IDeepCloneable<object>

+0

对不起,我错过了一些东西。你的回答我不清楚。编译错误:类型'object'不能用作泛型类型或方法'My.IDeepCloneable '中的类型参数'T'。没有从'object'到'My.IDeepCloneable ' – Pedro77

+0

的隐式引用转换因为对象不是'IDeepCloneable' - 所以您必须在想要深度克隆的对象上实现接口 – Charleh

+0

10使用您的原始示例,他意味着您可以这样做: var x = GetObject()as IDeepCloneable ; var clone = x.DeepClone(); ...假设'x'具有某种类型的IDeepCloneable '的某种类型的运行时类型。 –

2

在C#4.0中dynamic关键字可以解决此通过暂停类型检查,直到运行时:

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

将正常工作,只要有一种方法DeepClone()x

+2

只要有'DeepClone'返回'object'就没有什么好处。使用非通用接口甚至可以为您提供比此更高的编译时类型安全性,而不会限制所需的任何功能。 – Servy

+0

这不会暂停类型检查;它会导致成员绑定被推迟到运行时。绑定将按照通常在编译时执行的相同规则进行应用。关键的区别在于,成员将被绑定到'x'的运行时类型,这在编译时是未知的,事实上,如果为不同的运行时类型'x'调用代码,它可能会被绑定好几次。 –

+2

@Servy你在这里获得的是,你可能不知道'T'是什么,就像我说的那样...我必须在运行时生成的类型之前执行此操作,但这并不好玩,但它很有用。 – Mgetz

相关问题