无法将 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都实现一个接口,
  • 创建 AB 之间的转换机制。

如果您只想使用通用属性,请创建一个基础 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
    }
}

以下是

的示例
  1. 使两个 class 都继承自相同的基础 class

  2. 让两个class都实现一个接口

  3. 创建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; }
}