我有
public class MyClass1
{
public string Name;
public string Address;
}
public class MyClass2
{
public int Id;
public string Name;
public string Address;
}
var a = new MyClass1 {Name="SomeName", Address="SomeAddress" };
我不想做
b.Name = a.Name;
b.Address = a.Address
因为我有超过30个字段。
我想要的是:
MyClass2 b = a;
答案 0 :(得分:5)
你想要的是不可能的。我建议您AutoMapper,它允许您定义映射:
Mapper.CreateMap<MyClass1, MyClass2>();
然后在这两个类的实例之间进行映射:
var a = new MyClass1 { Name = "SomeName", Address = "SomeAddress" };
var b = Mapper.Map<MyClass1, MyClass2>(a);
作为奖励,您将能够执行以下操作:
IEnumerable<MyClass1> list1 = ...
IEnumerable<MyClass2> list2 = Mapper.Map<IEnumerable<MyClass1>, IEnumerable<MyClass2>>(list1);
另一种可能性是使用反射来遍历源对象的所有属性并将它们设置在目标对象中,但是为什么在存在像AutoMapper这样的优秀工具时重新发明轮子?
答案 1 :(得分:1)
它更好地使用反射,因为它可以循环所有属性并可以设置匹配属性的值
http://odetocode.com/articles/288.aspx
检查它是如何从属性中检索值的
PropertyInfo[] properties = type.GetProperties();
foreach(PropertyInfo property in properties)
{
}
答案 2 :(得分:1)
作为替代解决方案,您可以在MyClass2中创建一个构造函数,该构造函数接受MyClass1的实例并设置所有属性。
public class MyClass2
{
public int Id;
public string Name;
public string Address;
public MyClass2(MyClass1 a)
{
this.Name = a.Name;
this.Address = a.Address;
}
}
然后你可以这样做
MyClass2 b = new MyClass2(a);
答案 3 :(得分:0)
最简单的事情就是在MyClass2中使用一个名为updateFromClass1(MyClass1)的方法
您也可以使用Reflection。使用http://msdn.microsoft.com/en-us/library/ch9714z3.aspx从类型中获取所有字段。 FieldInfo有get和set方法来更新值。