0

宣言の両側 (入力と出力) で匿名型を使用してリストを作成することは可能ですか?

私はこのようなことをしたいと思います:

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 項目を含む新しいリストに変換したいだけです。私のアイデアは、クラス 1 にコンストラクターをセットアップし、(クラス 1 からクラス 2 への) 変換ジョブを実行することでした。しかし、そのようなことを行うより良い方法があるかもしれません。これらは私のクラスです:

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);
    }
}

どんな助けでも感謝します:)

4

3 に答える 3

1

あなたはただ書くことができます:

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

しかし、それが機能するためには、Class1 には Class2 をパラメーターとして受け取るコンストラクターが必要であり、これは私の意見ではあまり良くありません。

Class2 インスタンスを Class1 インスタンスに変換する別の静的メソッドを作成します。

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

そして、やります:

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

両方のクラスを結合することに満足している場合は、それらの 1 つに変換演算子を追加して、次のことを行うことができます。

List<Class1> list1 = list2.Cast<Class1>().ToList();
于 2013-07-16T12:48:20.323 に答える
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;
}
于 2013-07-16T12:19:18.080 に答える