c#中的动态结构成员是否可能依赖于另一个成员?

本文关键字:成员 依赖于 另一个 是否 动态 结构 | 更新日期: 2023-09-27 18:06:31

在本例中,二进制文件使用基于struct

的文件格式编写。
    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#中是否可以实现

c#中的动态结构成员是否可能依赖于另一个成员?

当然-在某种程度上您必须自己实现序列化,但是您可以很容易地做到这一点。

不清楚你使用的是什么类型的序列化-如果你使用来自。net的"原始"二进制序列化,你想覆盖GetObjectData,只添加序列化上的相关数据,然后在受保护的构造函数中使用SerializationInfoStreamingContext,从相同的数据反向填充你的结构。有关详细信息,请参阅这篇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);
}
顺便说一下,我要认真考虑结构体是否真的是最好的方法——考虑使用类来代替。我很少创建自己的结构体。

注意:您的示例只显示了嵌套结构类型的声明,而不是它的实例。

从你的问题措辞来看,你需要一个实例成员。

struct fileformat 
{ 
     struct mask  // type declaration only
     { 
            bool mem1present 
            bool mem2present 
            bool mem3present 
            //5 bits unused 
      } 
      public mask mask;    // <-- Member instance here
} 
如果我误解了,我道歉。也许你的结构体只是为了向我们传达文件的结构?