2011-06-29 57 views
0

我想爲自己創建一個轉換器類,我想聲明一個函數將一種類型的對象轉換爲另一種類型。如何在C#中定義自定義泛型轉換器

對於例如,如果有兩班 -

class A 
{ 
    private int ID {get;set;} 
    private string Name {get;set;} 
} 

class B 
{ 
    private int ID {get;set;} 
    private string Name {get;set;} 
    private string Address {get;set;} 
} 

我宣佈我的類方法是這樣 -

T2 Convert<T1, T2>(T1 t1_object) 
    { 
     A obj1 = (A)t1_object; 
     T2 obj2; 

// ... some logic here where properties of t1_object are copied to obj2 (which will be of type B class).... 

     return obj2;  
    } 

任何幫助將是巨大的。

謝謝!

+0

如果你立即將它轉換爲'A',爲什麼'T1'是一個通用參數? – SLaks

+0

您是否確實收到錯誤或只是尋找建議?上面的方法將工作(沒有確認代碼,只是過程),而不涉及額外的依賴性是一個可行的解決方案。 – ChrisBint

+0

@Chris - 我收到了關於T2類型轉換的錯誤。 – saarthak

回答

0

我upvoted devdigital的AutoMapper建議,但也想建議考慮重構你的類,如果可能從基類繼承。因此你的轉換/投射將會非常簡單。

0

我也在AutoMapper解決方案upvotet,一個可行的替代方案是​​,也許有點簡單。

0

您無法創建簡單的通用轉換器。

單程 - 使用反射。您可以自動轉換對象。但並不那麼簡單。你將不得不編寫一些代碼。

另一種方法 - 你可以使用非常簡單的轉換器。但是你必須爲每個案例描述轉換規則。通常不需要編寫大量用於轉換的代碼。這裏是你的情況的例子

public static class ConvertExtension //exstension for convertion 
{ 
    //automatic convertion 
    //later you define in lambda wich data needs to be converted 
    public static T Convert<S, T>(this S source, Action<S, T> convert) 
     where S : class 
     where T : class 
    { 
     T target = System.Activator.CreateInstance<T>(); 
     convert(source, target); 
     return target; 
    } 

    //convert data defined in interface 
    //you need copy all fields manually 
    public static T Convert<T>(this IData source) 
     where T : IData 
    { 
     T target = System.Activator.CreateInstance<T>(); 

     target.ID = source.ID; 
     target.Name = source.Name; 

     return target; 
    } 
} 

public interface IData //Describe common properties 
{ 
    int ID {get; set;} 
    string Name {get; set;} 
} 

class A : IData //Interface already implemented. You just mark classes with interface 
{ 
    public int ID { get; set; } 
    public string Name { get; set; } 
} 

class B : IData 
{ 
    public int ID { get; set; } 
    public string Name { get; set; } 
    public string Address { get; set; } 
} 

//example 
A a = new A(); 
B b1 = a.Convert<B>(); 
B b2 = a.Convert<A, B>((s, t) => t.ID = s.ID);