У меня есть несколько структур C #, которые придают форму структурам в очень большом файле данных. Эти структуры интерпретируют биты в словах данных файла и преобразуют их в первоклассные свойства. Вот пример одного:
[StructLayout(LayoutKind.Sequential, Pack = 1)]
public struct TimeF1_MsgDayFmt
{
// Time Data Words
public UInt16 TDW1;
public UInt16 TDW2;
public UInt16 TDW3;
/// <summary>
/// Tens of milliseconds
/// </summary>
public UInt16 Tmn
{
// Bits.Get is just a helper method in a static class
get { return Bits.Get(TDW1, 0, 4); }
set
{
if (value > 9)
throw new ArgumentOutOfRangeException();
TDW1 = Bits.Set(TDW1, value, 0, 4);
}
}
/// Several other properties follow.
Мне нужно сделать две вещи, которые, как мне кажется, связаны. Первый - иметь возможность проверять весь класс, используя набор правил проверки. Я знаю, что есть несколько способов сделать это; мне больше всего нравится аннотировать каждое свойство примерно так:
[ValidateRange(0,9)]
public UInt16 Tmn
{
get { return Bits.Get(TDW1, 0, 4); }
set
{
/// etc. Will probably no longer throw the ArgumentOutOfRangeException here.
... а затем использовать класс Validator
для чтения всех атрибутов свойств, проверять каждое значение свойства по аннотированному правила и возвращают коллекцию объектов ошибок.Но меня беспокоит, сколько времени займет Отражение; эти конструкции должны быть чрезвычайно эффективными.
public List<Error> Validate(TimeF1_MsgDayFmt original)
Второе, что мне нужно сделать, это выполнить аудит изменений свойств; то есть для каждого свойства, значение которого изменилось по сравнению с исходным, мне нужно иметь возможность получить строку, которая говорит «Свойство foo изменено с bar на baz». Для этого мне нужен способ сравнить все свойства структуры «до» и «после» struct
и отметить различия.
public List<string> Compare(TimeF1_MsgDayFmt original, TimeF1_MsgDayFmt new)
В обоих случаях код будет включать в себя итерацию по всем свойствам и изучение каждого из них по отдельности максимально быстро.
Как мне подойти к этому?