我们有两个类具有完全相同的公共访问器(以及其中许多),但它们来自对象层次结构中的不同区域;我们需要在这两个对象之间进行复制和比较。我们可以手动编写一个复制构造函数和一个比较运算符来比较同名访问器的值,但似乎必须有一个更好的方法来使用反射和LINQ。
示例:我们有类ClassA,它有70个访问器;我们还有类ClassB,它有70个访问器,它们的名称和类型与ClassA的访问器相同。
public class ClassA
{
int OneInt {get; set;}
int TwoInt {get; set;}
...
string OneString {get; set;}
string AnotherString {get; set;}
}
public class ClassB
{
int OneInt {get; set;}
int TwoInt {get; set;}
...
string OneString {get; set}
string AnotherString {get; set;}
}
我想要的是一种使用反射来发现ClassA的所有公共访问器的简单方法,并使用这些名称将ClassB上相应访问器的值设置为ClassA上访问器的值。粗略地说,在伪代码中:
foreach (string accName in ClassA.Accessors[])
BInstance.Accessors[accName].Value = AInstance.Accessors[accName].Value;
当然,同样的事情可以用来测试两个类之间的相等性。我对C#反射和LINQ的了解并不足以让我知道如何完成这项任务,但我发誓这是相对简单的事情。
答案 0 :(得分:5)
如何使用AutoMapper:
Mapper.CreateMap<ClassA, ClassB>();
然后:
ClassA classA = ...
ClassB classB = Mapper.Map<ClassA, ClassB>(classA);
它基本上是伪代码的实现。
答案 1 :(得分:2)
你的粗糙伪代码有点准确。让我把它清理一下:
foreach (var propertyA in typeof(ClassA).GetProperties())
{
var propertyB = typeof(ClassB).GetProperty(propertyA.Name);
var valueA = propertyA.GetValue(objectA, null);
propertyB.SetValue(objectB, valueA, null);
}
显然,这不会进行错误检查,而是这样的事情,但它应该可以完成这项工作。
你可以在Linq做到,但我认为它不会更干净。