如何在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
相关产品推荐
相关产品推荐

