2013-07-16 38 views
0

是否可以使用聲明的雙方(輸入和輸出)上的匿名類型創建列表?是否可以使用匿名類型在聲明的兩側(輸入和輸出)創建一個List?

我願做這樣的事情:

List<Class1> list = getList<Class1>(List<Class2> list2); 

...使用方法中聲明是這樣的:

public static List<T1> getList<T1>(List<T2> list2) 
{ 
    List<T1> list = new List<T1>(); 
    foreach (var item in list2) { 
     list.Add(new T1(item));     
    } 
    return list; 
} 

基本上,我只是想轉換包含列表class2項目添加到包含class1項目的新列表中。我的想法是在Class1中建立一個構造函數,執行轉換作業(從class1到class2)。但可能有更好的方法來做這樣的事情。 這些都是我的課:

public class Class2 
{ 
    string prop1 { get; set; } 
    string prop2 { get; set; } 
} 

public class Class1 
{ 
    string member1 { get; set; } 
    string member2 { get; set; } 

    //constructor: 'converts' class1 in class2 
    public Class1(Class2 class2) 
    { 
     this.member1 = Util.getThisAndThat(class2.prop1); 
     this.member2 = Util.doBunchOfStuff(class2.prop2); 
    } 
} 

任何幫助表示讚賞:)

+1

我不是100%確定你是什麼「問。它看起來像(除了缺少類型參數的泛型方法的聲明外),您正處於正確的軌道上。你問是否有更好的方法?或者你得到錯誤? – Tim

+0

如果這是特定於你的'Class1'和'Class2',那麼爲什麼不只是有一個方法'公共靜態列表 getList(列表列表2){\\ ...}'? – Corak

回答

1

另一個答覆中提到AutoMapper,但我會直接使用它。

Mapper.CreateMap<Class1, Class2>() 
     .ForMember(dest => dest.member1, 
       opt => opt.MapFrom(src => Util.getThisAndThat(src.prop1))) 
     .ForMember(dest => dest.member2, 
       opt => opt.MapFrom(src => Util.doBunchOfStuff(src.prop2))); 

public static List<T1> getList<T1>(List<T2> list2) 
{ 
    return Mapper.Map<List<T2>, List<T1>>(list2); 
} 
+0

謝謝,我會看看你的解決方案,當我有AutoMapper啓動並運行:) –

+0

現在,我做了,你的解決方案工作很好... –

+0

我很高興它適用於您! – Romoku

1

你可以做類似下面,如果它的工作原理。對於像Class1Class2這樣的不同類型,您需要實現該接口。但是,你實際上是在尋找好像AutoMapper

public interface ILoadable<T> 
{ 
    void LoadFrom(T other); 
} 

public class Class1 : ILoadable<Class2> 
{ 
    public void LoadFrom(Class2 other) 
    { 
     // Do property mapping here 
    } 
} 

public static List<T1> GetList<T1, T2>(List<T2> list2) where T1 : ILoadable<T2>, new() 
{ 
    List<T1> list = new List<T1>(); 
    foreach (var item in list2) { 
     T1 t1 = new T1(); 
     t1.LoadFrom(item); 
     list.Add(t1);     
    } 
    return list; 
} 
+0

像魅力一樣工作:)但是像@ user2266486所說的,最好避免使用其他類作爲參數的構造函數。我稍後會嘗試使用AutoMapper。謝謝! –

+0

我已經將您的解決方案啓動並運行(實際上將其標記爲我接受的答案),但現在我已經有了AutoMapper完成大部分工作,@Romoku答案對我來說稍微好一些。無論如何感謝:D –

1

你可以這樣寫:

List<Class1> list1 = list2.Select(class2 => new Class1(class2)).ToList(); 

但它的工作,1類必須有一個構造函數的Class2作爲參數,這是不是在我看來很大。

我會寫其中的Class2實例轉換爲Class1的實例都有一個單獨的靜態方法:

public static Class1 ToClass1(Class2 class2) 
{ 
    //return a Class1 instance 
} 

,做:

List<Class1> list1 = list2.Select(class2 => ToClass1(class2)).ToList(); 

如果你很高興有這兩個類之間的一些耦合,你可以添加一個conversion operator其中之一,並做:

List<Class1> list1 = list2.Cast<Class1>().ToList(); 
相關問題