You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在C#中动态筛选类中指定类型字段并实现字节序转换?

动态实现网络字节序与主机字节序自动转换

问题背景

我创建了用于网络通信的TestClassForNetwork类,手动实现了ToHostOrder和ToNetworkOrder方法来转换short类型字段的字节序,但每次新增short、int等多字节字段时,都需要修改这两个方法,维护成本较高。希望通过动态筛选类中的short、int类型字段,自动完成字节序转换。

实现方案

可以通过反射动态获取类中的目标类型字段,同时通过静态缓存字段信息避免重复反射带来的性能损耗,具体实现如下:

using System.Reflection;
using System.Net;
using System.Text.Json.Serialization;
using System.Runtime.InteropServices;

[StructLayout(LayoutKind.Sequential, Pack = 1)]
public class TestClassForNetwork
{
    [MarshalAs(UnmanagedType.ByValArray, SizeConst = 11), JsonIgnore]
    public byte[] field1;

    public short field2;
    public short field3;
    public short field4;
    public int field5;
    public int field6;

    // 静态缓存字段信息,避免每次反射开销
    private static readonly List<FieldInfo> _shortFields;
    private static readonly List<FieldInfo> _intFields;

    static TestClassForNetwork()
    {
        // 获取当前类的所有公开实例字段
        var allFields = typeof(TestClassForNetwork).GetFields(BindingFlags.Instance | BindingFlags.Public);
        
        // 筛选出short类型字段
        _shortFields = allFields.Where(f => f.FieldType == typeof(short)).ToList();
        // 筛选出int类型字段
        _intFields = allFields.Where(f => f.FieldType == typeof(int)).ToList();
    }

    public void ToHostOrder()
    {
        if (!BitConverter.IsLittleEndian) return;

        // 处理short类型字段的字节序转换
        foreach (var field in _shortFields)
        {
            var currentValue = (short)field.GetValue(this);
            var convertedValue = IPAddress.NetworkToHostOrder(currentValue);
            field.SetValue(this, convertedValue);
        }

        // 处理int类型字段的字节序转换
        foreach (var field in _intFields)
        {
            var currentValue = (int)field.GetValue(this);
            var convertedValue = IPAddress.NetworkToHostOrder(currentValue);
            field.SetValue(this, convertedValue);
        }
    }

    public void ToNetworkOrder()
    {
        if (!BitConverter.IsLittleEndian) return;

        // 处理short类型字段的字节序转换
        foreach (var field in _shortFields)
        {
            var currentValue = (short)field.GetValue(this);
            var convertedValue = IPAddress.HostToNetworkOrder(currentValue);
            field.SetValue(this, convertedValue);
        }

        // 处理int类型字段的字节序转换
        foreach (var field in _intFields)
        {
            var currentValue = (int)field.GetValue(this);
            var convertedValue = IPAddress.HostToNetworkOrder(currentValue);
            field.SetValue(this, convertedValue);
        }
    }
}

关键说明

  • 静态缓存字段:在静态构造函数中一次性获取并缓存类中的short、int字段,避免每次调用转换方法时重复执行反射逻辑,提升运行性能。
  • 反射操作逻辑:通过FieldInfo.GetValue读取字段当前值,完成字节序转换后用FieldInfo.SetValue写回字段,注意值类型的拆箱/装箱操作。
  • 字节序判断:仅在主机为小端序时执行转换,符合网络字节序(大端)的通用转换规则。

内容的提问来源于stack exchange,提问作者jjw

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.17 16:01:32