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 项目的新列表。我的想法是在 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);
    }
}

任何帮助表示赞赏:)

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

如果您很高兴在这两个类之间有一些耦合,您可以向其中一个类添加一个转换运算符并执行以下操作:

List<Class1> list1 = list2.Cast<Class1>().ToList();
于 2013-07-16T12:48:20.323 回答
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);
}
于 2013-07-16T12:38:03.930 回答
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 回答