2009-02-26 77 views
1

我有一個在值類型之間複製值的泛型方法。即使使用結構約束,以下方法也會產生設計時錯誤。任何想法如何在這些值之間進行復制或轉換?如何在具有值類型約束的泛型聲明類型之間進行復制

private Ttgt MyMethod<Tsrc,Ttgt>(Tsrc SourceObject) 
    where Tsrc : struct 
    where Ttgt : struct 
{ 
    //Error:cannot implictly convert type 'Tsrc' to 'Ttgt' 
    Ttgt returnObject = SourceObject; 

    //Error:Cannot convert type 'Tsrc' to 'Ttgt' 
    Ttgt returnObject = (Ttgt)SourceObject; 

    return returnObject; 
} 

回答

3

由於存在對你想一點點魔法反射之間的轉換可以做的伎倆類型註冊類型轉換器:

private Ttgt MyMethod<Tsrc,Ttgt>(Tsrc sourceObject) 
    where Tsrc:struct where Ttgt:struct  
{  
    Type targetType = typeof(Ttgt); 
    TypeConverter tc = TypeDescriptor.GetConverter(targetType); 
    Ttgt returnObject = (Ttgt)tc.ConvertTo(sourceObject, targetType); 
    return returnObject;  
} 

但是,由於在bool和int之間沒有轉換器,所以開箱即可使用非常有限。你想解決什麼問題?

我還發現另一個question與一些瘋狂的轉換代碼。

編輯: 您的評論清楚地表明您正在嘗試執行域對象與某種視圖/合同模型之間的對象到對象映射。你看過AutoMapper

+0

我寫一個遞歸對象到對象的映射。在WCF實現中將合同類從基礎業務邏輯類中分離出來。實現類與合同幾乎相同,但我不想在兩者之間引入依賴關係。 – 2009-02-27 09:20:41

1

//Error:Cannot convert type 'Tsrc' to 'Ttgt'

不能任意類型之間的轉換,除非有訪問的變換操作。

1

兩者被定義爲不同的類型。儘管它們都是結構,但它們不是同一類型。

同時定義烴源和目標是相同的類型:

private T MyMethod<T>(T source, T target) 
{ 
0

這是「按設計」。您正試圖在兩個不相關的值類型之間進行投射。這將永遠不會成功,因此它被標記爲錯誤。

對於所有值類型都是如此,因爲它們是隱式密封的。爲了在TSrc - > Ttgt之間進行強制轉換,兩個類型之間必須存在類層次關係。這不可能是因爲所有的值類型都是密封的,因此沒有辦法可以從另一個派生出來。

這可能會成功的唯一方法是如果有一個類型之間的自定義轉換運算符。情況可能如此。但是,在處理泛型類型時,將不處理自定義轉換運算符。

0

Convert類是爲了這個確切的目的而存在的。

private Ttgt MyMethod<Tsrc, Ttgt>(Tsrc SourceObject) 
    where Tsrc : struct 
    where Ttgt : struct 
{ 
    return (Ttgt) Convert.ChangeType(SourceObject, typeof(Ttgt)); 
} 

另外請注意,您可以此:

return (Ttgt) (object) SourceObject;