Я пишу программу, которая получает данные из базы данных и сравнивает его значение по значению для старых данных, а затем должна быть в состоянии:Лучший способ создать класс для сравнения экземпляров себя
- Выходные старые данные
- Выходные данные Новый
- Выход только Разницы
Таким образом, для простоты предположим, что я создал следующий класс для хранения значений:
class MyClass
{
// These fields will not be compared:
public string Id { get; set; }
public string Name { get; set; }
public string NONCompField1 { get; set; }
public int NONCompField2 { get; set; }
// These fields WILL be compared:
public string CompField1 { get; set; }
public int CompField2 { get; set; }
public int CompField3 { get; set; }
public double CompField4 { get; set; }
}
И, как следует из названия в моем примере, я хочу сравнить старые и новые значения, но только на основе CompFields
, чтобы найти различия.
Я знаю, что могу жестко закодировать решение следующим образом:
public IEnumerable<Tuple<string, string, string>> GetDiffs(MyClass Other)
{
var RetVal = new List<Tuple<string, string, string>>();
if (CompField1 != Other.CompField1)
RetVal.Add(Tuple.Create("CompField1", CompField1, Other.CompField1));
if (CompField2 != Other.CompField2)
RetVal.Add(Tuple.Create("CompField2", CompField2.ToString(), Other.CompField2.ToString()));
if (CompField3 != Other.CompField3)
RetVal.Add(Tuple.Create("CompField3", CompField3.ToString(), Other.CompField3.ToString()));
if (CompField4 != Other.CompField4)
RetVal.Add(Tuple.Create("CompField4", CompField4.ToString(), Other.CompField4.ToString()));
return RetVal;
}
И это дает мне обратно Tuple<string, string, string>
из (Field_Name
, Current_Value
, Old_Value
) и что работает просто отлично, но я ищу более удобный, способный динамический способ сделать это, что позволит добавлять новые поля в будущем - будь то CompareFields
(необходимо обновить GetDiffs
) или NONCompFields
(нет необходимости обновлять GetDiffs
).
Моей первой мыслью было бы использовать DataAnnotations
, а затем отражать, чтобы найти поля с определенным атрибутом и прокрутить их для метода GetDiffs
, но это похоже на чит/плохой способ делать что-то.
Есть ли лучший/более простой способ сделать это, что свести к минимуму необходимость обновления дополнительного кода?
Спасибо !!!
Если вы не возражаете против использования инструментов сторонних разработчиков, рассмотрите [это] (http://comparenetobjects.codeplex.com) –
Большое спасибо, @Ювальчжаков. Я стараюсь избегать использования внешней библиотеки, если это возможно, но это, безусловно, хорошо знать! Благодаря! –