当前位置: 首页 > news >正文

[C#]反射的实战应用,实际数据模拟

long? value = null;
// 看它是不是 HEX_STRING
var dtAttr = prop.GetCustomAttribute<DataTypeAttribute>();
if (dtAttr != null && dtAttr.DataType == DataType.HEX_STRING)
{// 去掉可能的 "0x" 前缀string txt = attribute.Value.StartsWith("0x", StringComparison.OrdinalIgnoreCase)? attribute.Value.Substring(2): attribute.Value;// 按十六进制解析if (long.TryParse(txt, NumberStyles.HexNumber, CultureInfo.InvariantCulture, out long hexResult))value = hexResult;
}
else
{// 按十进制解析if (long.TryParse(attribute.Value, NumberStyles.Integer, CultureInfo.InvariantCulture, out long decResult))value = decResult;
}
  1. 遍历 XML 里每个属性(XAttribute),
  2. 反射 找到同名的 GlobalParameter 属性 (PropertyInfo),
  3. 根据那个属性上有没有标记 [DataType(DataType.HEX_STRING)] 来决定“按十六进制”还是“按十进制”解析它的字符串值,
  4. 最后用 prop.SetValue(...) 把解析出来的 long? 写回到 globalParameter 对象里。

关键解析

var prop = type.GetProperty(attribute.Name.LocalName);
if (prop == null || !prop.CanWrite)continue;
  • typetypeof(GlobalParameter)attribute.Name.LocalName 比如 "P00A""P100"……

  • GetProperty("P00A") 就拿到 GlobalParameter.P00APropertyInfo

  • prop.CanWrite 确保它有公开的 setter,否则无需赋值。

  • GetCustomAttribute<DataTypeAttribute>() 读出你在属性上贴的 [DataType(DataType.HEX_STRING)]

  • 如果它是 HEX_STRING,就把字符串(可能以 "0x" 开头)切掉前缀,再用 NumberStyles.HexNumber 按 16 进制转成 long

  • 否则直接按 10 进制 NumberStyles.Integer 转。

prop.SetValue(globalParameter, value);
pnNotExists = false;
  • 这一行最关键:等同于 动态执行 globalParameter.P00A = value;globalParameter.P100 = value;
  • .NET 在后台会调用对应属性的 set 方法,把刚刚解析好的 long? 写进去。

举例模拟

假设 XML 节点是:

<GlobalParameterP00A="0x000B"P100="2500"
/>
  • 第一次循环

    • attribute.Name = "P00A", attribute.Value = "0x000B"
    • prop 对应 GlobalParameter.Pn00A,它有 [DataType(HEX_STRING)]
    • 去前缀后 txt = "000B"TryParse(..., HexNumber)hexResult = 11
    • prop.SetValue(globalParameter, 11) —— 相当于 globalParameter.P00A = 11;
  • 第二次循环

    • attribute.Name = "Pn100", attribute.Value = "2500"
    • prop 对应 GlobalParameter.P100,默认是 INT
    • TryParse("2500", Integer)decResult = 2500
    • prop.SetValue(globalParameter, 2500) —— 相当于 globalParameter.P100 = 2500;

最后返回的 globalParameter 对象里,

globalParameter.P00A == 11;   // 0x000B → 11
globalParameter.P100 == 2500; // 2500

正因为 SetValue 就是调用属性的 setter,所以新解析出来的值就“自动”存到那个实例里了。

相关文章:

  • 机器人项目管理新风口:如何高效推动智能机器人研发?
  • 第七部分:向量数据库和索引策略
  • 养生之道:在岁月里雕琢健康之美
  • 【刷题系列】LeetCode消失的数字、轮转数组
  • 图论---Bellman-Ford算法
  • Excel处理控件Spire.XLS系列教程:Java设置Excel活动工作表或活动单元格
  • 拼团退款中采用分片处理降低对数据库
  • Java String对象创建过程
  • Rk3568平台通过Jni读取摄像头当前状态值实践案例
  • 【一览表】病理图像处理流程
  • Linux:进程的创建进程的终止
  • ShenNiusModularity项目源码学习(21:ShenNius.Admin.Mvc项目分析-6)
  • 12N60-ASEMI无人机专用功率器件12N60
  • 【多智能体系统组织方式解析】五大架构赋能智能协作
  • 【办公类-89-02】20250424会议记录模版WORD自动添加空格补全下划线
  • Java 调用webservice接口输出xml自动转义
  • std::unorderd_map 简介
  • NestJS——使用TypeORM操作数据库、增删改查、关联查询、QueryBuilder
  • 黑马 redis面试篇笔记
  • ROS-真机向虚拟机器人映射
  • 中信证券:“国家队”未曾减持ETF,应充分相信国家维稳决心
  • 外交部否认中美就关税问题进行磋商谈判
  • 冲击一英里4分钟大关,基普耶贡挑战女子中长跑极限
  • 嫦娥八号任务合作项目,这十个入选
  • 下周起上海浦东将投放5000万元消费券,预计分五周发放
  • 云南洱源县4.8级地震:房屋受损442户,无人员伤亡报告