2013-10-04 85 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

相關問題