如何填充结构体数组,而无需为每个成员使用一行代码

本文关键字:成员 一行 代码 填充 何填充 结构体 数组 | 更新日期: 2023-09-27 18:16:01

我目前正在寻找一种更好的方法来填充结构体数组。首先,这是用来创建struct

的数据
enum DataType
{
    Uint8, Uint16, Byte, Int16, Int32,
    TypeSatInfo, TypeCell, ByteArray
}
enum ReadWriteState
{
    ReadWrite, ReadOnly, WriteOnly
}
struct Parameter
{
   public string ParamName;
   public short ParamId;
   public  DataType Datatype;
   public ReadWriteState ReadWrite;
}

然后我有一个类来保存我填充的数组

static class Parameters
{
    public static Parameter[] Param = new Parameter[80];
}

最后一部分是函数,我想用它来填充数组

void populateParameters()
{
    Parameters.Param[0].ParamName = "RevProtocol";
    Parameters.Param[0].ParamId = 0x0001;
    Parameters.Param[0].Datatype = DataType.Uint16;
    Parameters.Param[0].ReadWrite = ReadWriteState.ReadOnly;
    Parameters.Param[1].ParamName = "HwProtocol";
    Parameters.Param[1].ParamId = 0x0002;
    Parameters.Param[1].Datatype = DataType.Uint16;
    Parameters.Param[1].ReadWrite = ReadWriteState.ReadOnly;
    //keep this going until array is full.
}   

我希望这样做:

 Parameters.Param[80] = {{"RevProtocol", 0x0001, DataType.Uint16, ReadWriteState.ReadOnly},  
                         {"HwProtocol", 0x0002, DataType.Uint16, ReadWriteState.ReadOnly}}

通过这样做,我希望能够一次填充整个数组,但我似乎找不到正确的语法。这样的事情可能发生吗?

如何填充结构体数组,而无需为每个成员使用一行代码

你很接近了。当使用对象和集合初始化式时,仍然需要使用new关键字:

Parameters.Param = new Parameter[]
{
    new Parameter { ParamId = 0x0001, ParamName = "RevProtocol", Datatype = DataType.Byte },
    new Parameter { ParamId = 0x0002, ParamName = "HwProtocol", Datatype = DataType.TypeCell },
};

参见对象和集合初始化式(c#编程指南)

作为一种替代方法,正如您在评论中询问的那样,如何在不指定每个属性名称的情况下做到这一点,您可以使用类而不是结构,并添加自定义构造函数:

class Parameter
{
    public string ParamName;
    public short ParamId;
    public DataType Datatype;
    public ReadWriteState ReadWrite;
    public Parameter(string name,short id,DataType dt,ReadWriteState rw)
    {
        this.ParamName = name;
        this.ParamId = id;
        this.Datatype = dt;
        this.ReadWrite = rw;
    }
}
这样,你就可以像这样初始化你的数组:
Parameters.Param = new Parameter[] 
        { new Parameter("RevProtocol", 0x0001, DataType.Uint16, ReadWriteState.ReadOnly),
          new Parameter("HwProtocol", 0x0002, DataType.Uint16, ReadWriteState.ReadOnly)};