无法将IEnumerable <ViewmodelA>强制转换为IEnumerable <ViewmodelB>

时间:2019-11-19 07:02:13

标签: c# asp.net asp.net-mvc asp.net-core viewmodel

我检索了一个类型为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; }
}

5 个答案:

答案 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

我想到的头几个选择是:

  • 使两个类都继承自同一个基类,
  • 使两个类都实现一个接口,
  • 创建AB之间的转换机制。

答案 2 :(得分:1)

以下是@tymtam answer

的示例
  1. 使两个类都从相同的基类继承

  2. 使两个类都实现一个接口

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

答案 3 :(得分:0)

您只能这样做:

IEnumerable<ViewmodelB> newList = demoService.GetList().Select(a => SomeMethodCreatingBFromA(a));

SomeMethodCreatingBFromA可以是任何东西-可以调用构造函数,AutoMapper。没有使用AutoMapper太多,但是我想它有一个在集合之间转换的方法。

答案 4 :(得分:0)

如果只想使用公共属性,请创建一个基类或接口,在其中定义公共属性并从中派生两个类。然后,您可以使用基类或接口。