Чистый способ сравнения / копирования между похожими классами - PullRequest
1 голос
/ 10 ноября 2010

У нас есть два класса, которые имеют одинаковые общедоступные средства доступа (и многие из них), но принадлежат к разным областям в иерархии объектов;нам нужно скопировать и сравнить эти два объекта.Мы могли бы вручную написать конструктор копирования и оператор сравнения, который сравнивает значения одноименных методов доступа, но кажется, что должен быть лучший способ сделать это, используя отражение и LINQ.

Пример:у нас есть класс ClassA, который имеет 70 аксессоров;У нас также есть класс ClassB, который имеет 70 методов доступа, которые определены с тем же именем и типом, что и методы доступа ClassA.общедоступные средства доступа ClassA и используют эти имена для установки значений соответствующего средства доступа в ClassB равным значению средства доступа в ClassA.Грубо говоря, в psuedocode:

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

И, конечно, то же самое можно использовать для проверки равенства между двумя классами.Мои знания C # Reflection и LINQ недостаточно хороши, чтобы знать, как это сделать, но я клянусь, что это относительно просто.

Ответы [ 2 ]

5 голосов
/ 10 ноября 2010

Как насчет использования AutoMapper :

Mapper.CreateMap<ClassA, ClassB>();

, а затем:

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

Это в основном реализация вашего псевдокода.

2 голосов
/ 10 ноября 2010

Ваш грубый псевдокод несколько точен.Позвольте мне немного привести его в порядок:

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);
}

Очевидно, что это не проверка ошибок и тому подобное, но она должна выполнять свою работу.

Вы можете сделать это вЛинк, но я не думаю, что это будет чище.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...