У меня есть несколько структур 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)
В обоих случаях код будет включать в себя итерацию по всем свойствам и проверку каждого из них по отдельности, так быстро, насколько это возможно.
Как бы я подошел к этому