Высокопроизводительный аудит и проверка изменений в свойствах класса и структуры C #

У меня есть несколько структур 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)

В обоих случаях код будет включать в себя итерацию по всем свойствам и изучение каждого из них по отдельности максимально быстро.

Как мне подойти к этому?

7
задан Robert Harvey 10 October 2011 в 20:41
поделиться