C# 如何最小化viewmodel到对象转换中的代码?

C# 如何最小化viewmodel到对象转换中的代码?,c#,C#,我的上下文中有一个对象: abstract public partial class MyAbstractObject { public int Id{set;get;} public string Name{set;get;} } public partial class MyChildObject: MyAbstractObject { public string Details {set;get;} } 我有一个对象的视图模型: public class My

我的上下文中有一个对象:

abstract public partial class MyAbstractObject
{
    public int Id{set;get;}
    public string Name{set;get;}
}

public partial class MyChildObject: MyAbstractObject
{
    public string Details {set;get;} 
}
我有一个对象的视图模型:

public class MyAbstractViewModel
{
    public int Id{set;get;}
    public string Name{set;get;}
}

public class MyChildViewModel: MyAbstractViewModel
{
    public string Details {set;get;} 
}
现在,对于将视图模型转换为对象,我使用了以下内容:

public MyChildObject MakeChildObject(MyChildViewModel vm)
{
  var child = new  MyChildObject();
  child.Id = vm.Id;
  child.Name = vm.Name;
  child.Details= vm.Details;

  return child;
 }
我在
MyAbstractObject
属性中的问题。如果我有几个子对象,我会为每个子对象创建一个
MakeChildObject
方法。所有这些方法对于
MyAbstractObject
属性都有相同的代码行:

  child.Id = vm.Id;
  child.Name = vm.Name;

如何最小化代码?

看看automapper

它将自动映射类似的命名属性。它还包括用于映射基础对象的功能。 另见

考虑是否可以在您的案例中使用AutoMapper。它将根据属性名称自动映射不同类型的对象。这可能会节省您自己编写所有映射代码的时间

然后将引导映射程序,如下所示:

Mapper.CreateMap<MyChildViewModel, MyChildObject>();

请尝试下面的代码示例来解决您的问题

public class MyAbstractViewModel
{
    public int Id{set;get;}
    public string Name{set;get;}

  public void MakeChildObject(MyAbstractViewModel vm, MyAbstractObject child)
  {
    child.Id = vm.Id;
    child.Name = vm.Name;
  }
}

public class MyChildViewModel: MyAbstractViewModel
{
  public string Details {set;get;} 

  public MyChildObject MakeChildObject(MyChildViewModel vm)
  {
    var child = new  MyChildObject();
    this.MakeChildObject(this, child);

    child.Details= vm.Details;

    return child;
  }
}

这听起来很适合所描述的问题。我不想使用任何库。我只是想了解人们是如何解决这个问题的。@KliverMax当足够多的人解决了同样的问题,就会有人在某处开发一个解决这个问题的库。然后,人们将不再试图解决同样的问题,而是使用经过良好测试和健壮的库。AutoMapper是开源的。你可以看看它是如何实现对象的递归映射的
public class MyAbstractViewModel
{
    public int Id{set;get;}
    public string Name{set;get;}

  public void MakeChildObject(MyAbstractViewModel vm, MyAbstractObject child)
  {
    child.Id = vm.Id;
    child.Name = vm.Name;
  }
}

public class MyChildViewModel: MyAbstractViewModel
{
  public string Details {set;get;} 

  public MyChildObject MakeChildObject(MyChildViewModel vm)
  {
    var child = new  MyChildObject();
    this.MakeChildObject(this, child);

    child.Details= vm.Details;

    return child;
  }
}