无法将 IEnumerable<ViewmodelA> 转换为 IEnumerable<ViewmodelB>
Cannot cast IEnumerable<ViewmodelA> to IEnumerable<ViewmodelB>
我检索了一个类型为 IEnumerable<ViewmodelA>
的列表,需要将此列表转换为 IEnumerable<ViewmodelB>
。每个 viewmodel
中都有相同和不同的属性,我只想映射相同的属性(Name 和 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; }
}
视图模型B:
public class ViewmodelB {
public string Name { get; set; }
public string Surname { get; set; }
public string Work { get; set; }
public string Address { get; set; }
}
你只能做:
IEnumerable<ViewmodelB> newList = demoService.GetList().Select(a => SomeMethodCreatingBFromA(a));
其中 SomeMethodCreatingBFromA
可以是任何东西 - 调用构造函数、AutoMapper 等等。没有经常使用 AutoMapper,但我想它有一个在集合之间转换的方法。
您将无法将 ViewmodelA
转换为 ViewmodelB
。
首先想到的几个选项是:
- 使两个 class 继承自相同的基础 class,
- 让两个class都实现一个接口,
- 创建
A
和 B
之间的转换机制。
如果您只想使用通用属性,请创建一个基础 class 或接口,您可以在其中定义通用属性并从中派生两个 class。然后你可以使用基础class或接口
对于像这个操作这样微不足道的事情,我想我会:
var modelbs = modelas.Select(
a => new Viewmodelb(){
Name = a.Name,
Surname = a.Surname
}
);
您可以使两个视图模型都继承自包含姓名和姓氏的基础,但请注意,这不允许您将模型转换为模型,您只能将模型转换为基础class。
或者您可以在 modelb 中提供一个构造函数,它接受一个 modela 对象并从中提取 name/surname 并像这样使用它:
var modelbs = modelas.Select(
a => new Viewmodelb(a)
);
您的 class 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
}
}
以下是
的示例
使两个 class 都继承自相同的基础 class
让两个class都实现一个接口
创建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; }
}
我检索了一个类型为 IEnumerable<ViewmodelA>
的列表,需要将此列表转换为 IEnumerable<ViewmodelB>
。每个 viewmodel
中都有相同和不同的属性,我只想映射相同的属性(Name 和 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; }
}
视图模型B:
public class ViewmodelB {
public string Name { get; set; }
public string Surname { get; set; }
public string Work { get; set; }
public string Address { get; set; }
}
你只能做:
IEnumerable<ViewmodelB> newList = demoService.GetList().Select(a => SomeMethodCreatingBFromA(a));
其中 SomeMethodCreatingBFromA
可以是任何东西 - 调用构造函数、AutoMapper 等等。没有经常使用 AutoMapper,但我想它有一个在集合之间转换的方法。
您将无法将 ViewmodelA
转换为 ViewmodelB
。
首先想到的几个选项是:
- 使两个 class 继承自相同的基础 class,
- 让两个class都实现一个接口,
- 创建
A
和B
之间的转换机制。
如果您只想使用通用属性,请创建一个基础 class 或接口,您可以在其中定义通用属性并从中派生两个 class。然后你可以使用基础class或接口
对于像这个操作这样微不足道的事情,我想我会:
var modelbs = modelas.Select(
a => new Viewmodelb(){
Name = a.Name,
Surname = a.Surname
}
);
您可以使两个视图模型都继承自包含姓名和姓氏的基础,但请注意,这不允许您将模型转换为模型,您只能将模型转换为基础class。
或者您可以在 modelb 中提供一个构造函数,它接受一个 modela 对象并从中提取 name/surname 并像这样使用它:
var modelbs = modelas.Select(
a => new Viewmodelb(a)
);
您的 class 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
}
}
以下是
使两个 class 都继承自相同的基础 class
让两个class都实现一个接口
创建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; }
}