Возможно ли иметь динамические члены структуры, зависящие от другого члена в C # - PullRequest
0 голосов
/ 25 августа 2011

в этом случае двоичный файл записывается с форматом файла на основе структуры

    struct fileformat
    {
         struct mask
         {
                bool mem1present
                bool mem2present
                bool mem3present
                //5 bits unused
          }
          //member only written in file if mem1present is true
          byte mem1present
          //member only written in file if mem2present is true
          byte mem1present
          //member only written in file if mem3present is true
          byte mem1present
    }

возможно ли это реализовать в c #

Ответы [ 2 ]

0 голосов
/ 25 августа 2011

Примечание. В вашем примере показано только объявление вложенного типа структуры, а не его экземпляр.

Из формулировки вашего вопроса вам нужен член экземпляра.

struct fileformat 
{ 
     struct mask  // type declaration only
     { 
            bool mem1present 
            bool mem2present 
            bool mem3present 
            //5 bits unused 
      } 

      public mask mask;    // <-- Member instance here
} 

Я прошу прощения, если я неправильно понял. Возможно, ваша структура была только для того, чтобы сообщить нам структуру файла?

0 голосов
/ 25 августа 2011

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

Непонятно, какую сериализацию вы используете - если вы используете «сырую» двоичную сериализацию из .NET, вы хотите переопределить GetObjectData, чтобы добавить только соответствующие данные при сериализации, а затем в защищенную конструктор, принимающий SerializationInfo и StreamingContext, заполняет вашу структуру из тех же данных в обратном порядке. Подробнее см. в этой статье MSDN .

Я не знаю, что произойдет, если вы используете сериализацию XML.

Если вы пишете свою собственную сериализацию (т. Е. У вас есть метод, такой как WriteToStream), тогда вы можете, конечно, представлять его так, как хотите.

РЕДАКТИРОВАТЬ: Похоже, у вас, вероятно, есть существующий формат файла, в котором вы должны прочитать, но вы можете определить свои собственные типы. Легко иметь класс или структуру с несколькими членами и , возможно, маску, чтобы сказать, что установлено, хотя, не зная больше, это может быть не лучшим дизайном. Хотя вы можете использовать явный макет, чтобы сделать это эффективным в памяти, вероятно, проще всего иметь отдельные члены:

struct Foo
{
    // Bit-set to determine which fields are actually used
    private readonly byte mask;

    private readonly int value1;
    private readonly int value2;
    private readonly int value3;

    public Foo(byte mask, int value1, int value2, int value3)
    {
        this.mask = mask;
        this.value1 = value1;
        this.value2 = value2;
        this.value3 = value3;
    }
}

Тогда где-то (либо в типе данных, либо нет), что-то вроде:

Foo ReadFoo(Stream stream)
{
    byte mask = stream.ReadByte();
    int value1 = 0, value2 = 0, value3 = 0;
    if ((mask & 1) == 1)
    {
       // However you do that, depending on your file format
        value1 = ReadInt32FromStream(stream); 
    }
    if ((mask & 2) == 2)
    {
       // However you do that, depending on your file format
        value2 = ReadInt32FromStream(stream); 
    }
    if ((mask & 4) == 4)
    {
       // However you do that, depending on your file format
        value3 = ReadInt32FromStream(stream); 
    }
    return new Foo(mask, value1, value2, value3);
}

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

...