Аудит и проверка изменений в классе C # и свойствах структуры высокопроизводительным способом - PullRequest
7 голосов
/ 10 октября 2011

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

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

Как бы я подошел к этому

1 Ответ

2 голосов
/ 11 октября 2011

Если проблема в том, что Соответствует ли считываемые данные в структуре дополнительным ограничениям , вам прежде всего необходимо выяснить, как записать такие ограничения. (В вашем примере вы написали [ValidateRange (0,9)] в качестве одного из таких ограничений).

Как только у вас есть средство для записи ограничений, вы должны предположительно прочитать данные в соответствующую структуру и , а затем проверить ограничения. (В вашем примере вы предложили идею использования отражения).

Мне кажется, самый простой способ записать такие ограничения, которые выполняются быстро, - это просто записать их как дополнительный код C #. Для каждого ограничения, которое вы можете себе представить, вы можете добавить метод класса, который проверяет ограничение и возвращает логическое значение. Вы можете добавить стандартное ограничение «CheckIt», которое вычисляет конъюнкцию всех отдельных методов ограничения.

Должно быть легко написать ограничения. Я ожидаю, что компилятор C # встроит другие методы, особенно если они маленькие и не принимают аргументов (кроме подразумеваемого класса). Это должно сделать их быстрыми.

Если компилятор C # не сделает этого, переключитесь на C ++, где вы можете в значительной степени форсировать вставку.

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