问题描述
|
我有
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;
解决方法
您想要的是不可能的。我建议您使用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这样的出色工具时,为什么要重新发明轮子呢?
,最好使用反射,因为它可以循环所有属性并可以设置匹配属性的值
http://odetocode.com/articles/288.aspx
检查它如何从属性中检索值
PropertyInfo[] properties = type.GetProperties();
foreach(PropertyInfo property in properties)
{
}
,作为替代解决方案,您可以在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);
,最简单的操作是在MyClass2中简单地拥有一个名为updateFromClass1(MyClass1)的方法
您也可以使用Reflection。使用http://msdn.microsoft.com/zh-cn/library/ch9714z3.aspx从类型中获取所有字段。
FieldInfo具有get和set方法来更新值。