Вопрос связан с сопоставлением таблиц базы данных. Скажем, мы помещаем левую строку в экземпляр Left и Right на экземпляр Right того же типа. И мы собираем много таблиц и соответствующих типов.Общая классификация сравнения объектов
Как реализовать более или менее общую процедуру, приводящую к сбору различий, например.
propertyName, leftValue, rightValue для каждой такой пары экземпляров того же типа. Помимо общего алгоритма сравнения, поскольку leftValue и rightValue могут быть любыми (пара строк или int или DateTime или Guid), не очевидно, как объединить все это в одной коллекции.
EDIT:
class OneOfManyTypesBasedOnTableRow
{
Guid uid,
int anotherId,
string text1,
string text2,
DateTime date1,
DateTime date2
}
class AnotherOfManyTypesBasedOnTableRow
{
Guid uid,
int anotherId,
string text3,
string text4,
DateTime date3,
DateTime date4
}
//For type 1
OneOfManyTypesBasedOnTableRow Left = new Something().GetLeft() ;
OneOfManyTypesBasedOnTableRow Right = new Something().GetRight() ;
DiffCollection1 diff1 = comparer.GetDiffForOneOfManyTypesBasedOnTableRow (Left , Right) ;
//For type 2
AnotherOfManyTypesBasedOnTableRow Left = new SomethingElse().GetLeft() ;
AnotherOfManyTypesBasedOnTableRow Right = new SomethingElse().GetRight() ;
DiffCollection2 diff2 = comparer.GetDiffForAnotherOfManyTypesBasedOnTableRow (Left , Right) ;
Моя проблема заключается в том, что я не знаю, как избежать повторения этого весьма похожего кода для каждого типа. Это может быть нормально для объектов. Но в дифф методы, которые я должен кодировать
if Left.Text1.Equals (Right.Text1)
и так далее в одном методе
if Left.Text3.Equals (Right.Text3)
и так далее в другом методе
Можете ли вы поместить некоторый код psuedo, описывая это. –
Одна вещь, которую я сделал, это сделать метод, который возвращает список значений (по порядку), которые являются «важными». Затем я использую этот список (а не фактический) для сравнения Equality и создания Hash.Это похоже на несколько более автоматизированный процесс, как упоминается в ответе Мэтью, но помещает «выбор поля импорта» в руки объекта (атрибуты также могут использоваться, я думаю). Это можно сделать очень легко через несколько объектов с интерфейсом и статическим помощником или методом расширения - должно быть меньше ~ 8 строк кода для каждого класса. – 2011-01-15 21:30:10