1

我们有两个类具有完全相同的公共访问器(其中许多),但来自对象层次结构中的不同区域;我们需要在这两个对象之间进行复制和比较。我们可以手动编写一个复制构造函数和一个比较运算符来比较同名访问器的值,但似乎必须有更好的方法来使用反射和 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 的了解还不足以知道如何完成这项工作,但我发誓这是相对简单的事情。

4

2 回答 2

5

如何使用AutoMapper

Mapper.CreateMap<ClassA, ClassB>();

进而:

ClassA classA = ...
ClassB classB = Mapper.Map<ClassA, ClassB>(classA);

它基本上是您的伪代码的实现。

于 2010-11-10T18:29:42.447 回答
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 中做到这一点,但我认为它不会更干净。

于 2010-11-10T18:34:39.933 回答