我检索了一个类型为IEnumerable<ViewmodelA>
的列表,并且需要将该列表转换为IEnumerable<ViewmodelB>
。每个viewmodel
中都有相同和不同的属性,我只想映射相同的属性(名称和Surnmame)。是否可以使用拳击或AutoMapper
?我尝试了拳击,但没有用:(
IEnumerable<ViewmodelB> newList;
newList = (IEnumerable<ViewmodelB>)demoService.GetList(); //returns IEnumerable<ViewmodelA>
ViewodelA:
public class ViewmodelA {
public string Name { get; set; }
public string Surname { get; set; }
public string School { get; set; }
public string Number { get; set; }
}
ViewodelB:
public class ViewmodelB {
public string Name { get; set; }
public string Surname { get; set; }
public string Work { get; set; }
public string Address { get; set; }
}
答案 0 :(得分:3)
对于这种操作如此微不足道的事情,我想我只会做:
var modelbs = modelas.Select(
a => new Viewmodelb(){
Name = a.Name,
Surname = a.Surname
}
);
您可以使两个视图模型都从其中具有名称和姓氏的基类继承,尽管请注意,这不允许您将modela转换为modelb,只能将modela转换为基类。
或者您可以在modelb中提供一个构造函数,该构造函数接受modela对象并从中拉出名称/姓氏,并像这样使用它:
var modelbs = modelas.Select(
a => new Viewmodelb(a)
);
您的类ViewmodelB看起来像:
public class ViewmodelB {
public string Name { get; set; }
public string Surname { get; set; }
public string Work { get; set; }
public string Address { get; set; }
public ViewmodelB(ViewmodelA x){
Name = x.Name;
Surname = x.Surname;
//maybe initialize other properties here
}
}
答案 1 :(得分:2)
您将无法将ViewmodelA
投射到ViewmodelB
。
我想到的头几个选择是:
A
和B
之间的转换机制。答案 2 :(得分:1)
使两个类都从相同的基类继承
使两个类都实现一个接口
创建A与B之间的转换机制
{
/// <summary>
/// Using the same base class
/// </summary>
public class BaseClass
{
public string Property { get; set; }
}
public class ViewModelA : BaseClass
{
public string Property { get; set; }
}
public class ViewModelB : BaseClass
{
public string Property { get; set; }
}
/// <summary>
/// Using the same interface
/// </summary>
public interface BaseInterface
{
string Property { get; set; }
}
public class ViewModelA : BaseInterface
{
public string Property { get; set; }
}
public class ViewModelB : BaseInterface
{
public string Property { get; set; }
}
/// <summary>
/// Create a conversion mechanism. This can be done in either in ViewModelA or ViewModelB
/// </summary>
public class ViewModelA
{
public string Property { get; set; }
public static implicit operator ViewModelA(ViewModelB model) => new ViewModelA { Property = model.Property };
public static implicit operator ViewModelB(ViewModelA model) => new ViewModelB { Property = model.Property };
}
public class ViewModelB
{
public string Property { get; set; }
}
答案 3 :(得分:0)
您只能这样做:
IEnumerable<ViewmodelB> newList = demoService.GetList().Select(a => SomeMethodCreatingBFromA(a));
SomeMethodCreatingBFromA
可以是任何东西-可以调用构造函数,AutoMapper。没有使用AutoMapper太多,但是我想它有一个在集合之间转换的方法。
答案 4 :(得分:0)
如果只想使用公共属性,请创建一个基类或接口,在其中定义公共属性并从中派生两个类。然后,您可以使用基类或接口。