簡體   English   中英

在相似類之間進行比較/復制的干凈方法

[英]Clean way to Compare / Copy between Similar Classes

我們有兩個類,它們具有完全相同的公共訪問器(很多訪問器),但是它們來自對象層次結構的不同區域。 我們需要在這兩個對象之間進行復制和比較。 我們可以手動編寫一個復制構造函數和一個比較運算符,用於比較同名訪問器的值,但是似乎必須有一種使用反射和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上的訪問器的值。 大致來說,在psuedocode中:

foreach (string accName in ClassA.Accessors[])
    BInstance.Accessors[accName].Value = AInstance.Accessors[accName].Value;

而且,當然,同一件事可用於測試兩個類之間的相等性。 我對C#反射和LINQ的了解不足以知道如何完成此工作,但是我發誓這是相對簡單的事情。

如何使用AutoMapper

Mapper.CreateMap<ClassA, ClassB>();

接着:

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

它基本上是偽代碼的實現。

您的粗略偽代碼有些准確。 讓我整理一下:

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中做到這一點,但我認為這不會更干凈。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM