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