C# 访问结构数组中的字段

C# 访问结构数组中的字段,c#,arrays,struct,field,C#,Arrays,Struct,Field,我希望有人能帮我解决这个问题 我正在制定一个通过以太网UDP与一些节点通信的协议 我试图用这段代码实现的是,我想通过其源ID和注册表添加传感器数据结构中节点的数据 我在我的“MicroRov_Protocol_Structs.cs”中做了一些结构 但我希望代码是这样的: // save data by sensor number: sensorData.SENSORS_DATA[(byte)microRov_msg_header.SOURCE_ID

我希望有人能帮我解决这个问题

我正在制定一个通过以太网UDP与一些节点通信的协议

我试图用这段代码实现的是,我想通过其源ID和注册表添加传感器数据结构中节点的数据

我在我的“MicroRov_Protocol_Structs.cs”中做了一些结构

但我希望代码是这样的:

    // save data by sensor number:
                    sensorData.SENSORS_DATA[(byte)microRov_msg_header.SOURCE_ID].microRov_msg_header.REGISTER_ADDRESS  = microRov_data.ALL_DATA[(byte)microRov_msg_header.REGISTER_ADDRESS];


 dataFromMicroRovProtocolCallback(ipAddress, ListenPort, buffer, microRov_data, StateMachines_Structs.ProtocolDataState.Data, microRov_msg_header.REGISTER_ADDRESS);

     }


    }
  }
  catch
  {
  }
}
我希望有人能帮我一些关于这方面的信息。我更喜欢这样编写代码,而不是制作一个巨大的开关盒结构。我曾尝试在网上搜索一些代码示例,但没有。
我已经尽可能详细地解释了这个问题

SENSORS\u DATA
是一种类型为
MICRO\u ROV\u REGISTRY\u DATA
的数组
MICRO ROV_msg_header
是类型为
MICRO_ROV_REGISTRY_DATA
的对象,并且不是
MICRO_ROV_REGISTRY_DATA
的成员


向数组中添加对象时,会在数组中创建对象引用,而不是对象本身。

我已编辑了您的标题。请看,“,共识是“不,他们不应该”。我不知道。你好,谢谢你的回复。我仍然不知道如何在我的代码中使用它。你能给我指一篇解释这一点的文章吗?或者你能更详细地解释一下吗?只需要谷歌对象数组。你会看到大量的文章详细地解释了如何访问其中的对象。
// structs        
    public MICRO_ROV_ADDRESS microRov_address = new MICRO_ROV_ADDRESS();
    public MICRO_ROV_REGISTRY_DATA microRov_data = new MICRO_ROV_REGISTRY_DATA();        
    public MICRO_ROV_MESSAGE_HEADER microRov_msg_header = new MICRO_ROV_MESSAGE_HEADER();
    public MICRO_ROV_STATUS_DATAINDEX microRov_dataindex = new MICRO_ROV_STATUS_DATAINDEX();
    public SENSOR_DATA sensorData = new SENSOR_DATA();
    //
    microRov_data.ALL_DATA = new MICRO_ROV_MESSAGE_HEADER[255];
    //
    microRov_data.FunctionArray = new Dictionary<object, Func<int, double>>(); 
    microRov_data.FunctionArray[(byte)MICRO_ROV_ADDRESS.BOARD_ADDRESS] =   controller_information.GetVersionNumber;
    microRov_data.FunctionArray[(byte)MICRO_ROV_ADDRESS.BOARD_SERIAL_NUMBER] = controller_information.GetSerialNumber;
    microRov_data.FunctionArray[(byte)MICRO_ROV_ADDRESS.BOARD_TEMPERATURE] = ntc_calc.findNTCTemp;
    microRov_data.FunctionArray[(byte)MICRO_ROV_ADDRESS.BOARD_VOLTAGE] = volt_calc.findVoltage;
    //
    sensorData.SENSORS_DATA = new MICRO_ROV_REGISTRY_DATA[255];
private void ProcessAllData(IPAddress ipAddress, int ListenPort, byte[] buffer)
    {
        try
        {
            // check if message length is ok.
            if (buffer.Length == (byte)MICRO_ROV_STATUS_DATAINDEX.Packet_Length)
            {
                // calculate checksum of buffer
                Int16 checksumBuffer = additiveChecksum.ComputeChecksumBytes(buffer, (byte)(buffer.Length - 1));

                // update crc fields in buffer
                microRov_msg_header.CHECKSUM = buffer[(byte)MICRO_ROV_STATUS_DATAINDEX.Checksum];

                // updata field containig info regarding crc validity
                if (microRov_msg_header.CHECKSUM == checksumBuffer)
                {
                    microRov_msg_header.LAST_RX = DateTime.Now;

                    microRov_msg_header.DESTINATION_ID = (ADRESSES)buffer[(byte)MICRO_ROV_STATUS_DATAINDEX.Destination];
                    microRov_msg_header.SOURCE_ID = (ADRESSES)buffer[(byte)MICRO_ROV_STATUS_DATAINDEX.Source];
                    microRov_msg_header.DATA_LENGTH = buffer[(byte)MICRO_ROV_STATUS_DATAINDEX.DataLength];
                    microRov_msg_header.REGISTER_ADDRESS = (MICRO_ROV_ADDRESS)buffer[(byte)MICRO_ROV_STATUS_DATAINDEX.Register];

                    //
                    microRov_msg_header.Data8bit_MSB = buffer[(byte)MICRO_ROV_STATUS_DATAINDEX.Data_MSB];
                    microRov_msg_header.Data8bit_LSB = buffer[(byte)MICRO_ROV_STATUS_DATAINDEX.Data_LSB];
                    //
                    microRov_msg_header.Data16bit = (byte)microRov_msg_header.Data8bit_MSB << 8 | (byte)microRov_msg_header.Data8bit_LSB;

                    // add data to its location in the array
                    microRov_data.ALL_DATA[(byte)microRov_msg_header.REGISTER_ADDRESS] = (MICRO_ROV_MESSAGE_HEADER)microRov_msg_header;
                    // calculate
                    microRov_data.ALL_DATA[(byte)microRov_msg_header.REGISTER_ADDRESS].DataCalculated = microRov_data.FunctionArray[(byte)microRov_msg_header.REGISTER_ADDRESS](microRov_msg_header.Data16bit);

                    MICRO_ROV_ADDRESS test = microRov_msg_header.REGISTER_ADDRESS;

                    //Type type = typeof(SENSOR_DATA);
                    //FieldInfo[] fields = type.GetFields();
                    //
                    //FieldInfo info = sensorData.SENSORS_DATA[(byte)microRov_msg_header.SOURCE_ID].GetType().GetField("BOARD_TEMPERATURE");
                    //FieldInfo info = sensorData.SENSORS_DATA[(byte)microRov_msg_header.SOURCE_ID].GetField("MaxValue");
                    //Console.WriteLine(info.ToString());

                    //info.SetValue(sensorData.SENSORS_DATA[(byte)microRov_msg_header.SOURCE_ID], microRov_data.ALL_DATA[(byte)microRov_msg_header.REGISTER_ADDRESS]);
     // save data by sensor number:
                    sensorData.SENSORS_DATA[(byte)microRov_msg_header.SOURCE_ID].BOARD_TEMPERATURE  = microRov_data.ALL_DATA[(byte)microRov_msg_header.REGISTER_ADDRESS];
    // save data by sensor number:
                    sensorData.SENSORS_DATA[(byte)microRov_msg_header.SOURCE_ID].microRov_msg_header.REGISTER_ADDRESS  = microRov_data.ALL_DATA[(byte)microRov_msg_header.REGISTER_ADDRESS];


 dataFromMicroRovProtocolCallback(ipAddress, ListenPort, buffer, microRov_data, StateMachines_Structs.ProtocolDataState.Data, microRov_msg_header.REGISTER_ADDRESS);

     }


    }
  }
  catch
  {
  }
}