使用PropertyInfo遍历对象在OptiX中出现参数不匹配异常
在Allen Bradley OptiX 1.6.2.36中使用PropertyInfo遍历匿名对象时抛出"Parameter count mismatch"异常
环境信息
本地安装的.NET版本:
Microsoft .NET Runtime - 8.0.7 (x86) Microsoft .NET SDK 9.0.301 (x64) Microsoft ASP.NET Core 8.0.7 OPC .NET API 2.00 Redistributables 106.0
问题场景
待遍历的匿名对象数组:
Children = new object[] { new { name = "path", fill_rule = "evenodd" , clip_rule = "evenodd", d = "M8 16L3.54223 12.3383C1.93278 11.0162 1 9.04287 1 6.96005C1" + " 3.11612 4.15607 0 8 0C11.8439 0 15 3.11612 15 6.96005C15" + " 9.04287 14.0672 11.0162 12.4578 12.3383L8 16ZM3 6H5C6.10457" + " 6 7 6.89543 7 8V9L3 7.5V6ZM11 6C9.89543 6 9 6.89543 9 8V9L13 7.5V6H11Z", fill = "#000000" } };
遍历代码:
for (int intChild = 0; intChild < Children.Length; intChild++) { object objChild = Children[intChild]; Console.WriteLine($"intChild:{intChild}"); PropertyInfo[] aryProperties = objChild.GetType().GetProperties(); Console.WriteLine($"PropertyInfo.Length: {aryProperties.Length}"); foreach (PropertyInfo piMember in aryProperties) { Console.WriteLine($"Name:{piMember.Name}"); var varValue = piMember.GetValue(objChild); if (varValue == null) { continue; } Console.WriteLine($"Value:{varValue}"); } }
这段代码在常规.NET环境可正常运行,但在OptiX中执行时,内层循环第二次迭代抛出**Exception: Parameter count mismatch.**异常并终止。
问题分析
异常提示参数不匹配,说明OptiX环境中,匿名对象的类型被额外添加了需要参数的属性(比如索引器),或者GetType().GetProperties()返回的结果包含了非实例属性/带参数的属性。常规.NET里匿名类型只有定义的实例属性,但OptiX的运行时可能对类型做了动态修改或包装,导致遍历到了需要参数才能访问的属性,调用GetValue(objChild)时因为没传参数而报错。
解决方案
方案1:过滤带参数的属性
在遍历PropertyInfo时,只处理无参数的实例属性,添加判断条件过滤掉索引器或需要参数的属性:
foreach (PropertyInfo piMember in aryProperties) { // 跳过需要参数的属性(如索引器) if (piMember.GetIndexParameters().Length > 0) continue; Console.WriteLine($"Name:{piMember.Name}"); var varValue = piMember.GetValue(objChild); if (varValue == null) { continue; } Console.WriteLine($"Value:{varValue}"); }
方案2:改用强类型类替代匿名类型
匿名类型在特殊运行环境中可能存在兼容性问题,定义对应的强类型类来存储数据,避免类型包装带来的异常:
public class PathElement { public string name { get; set; } public string fill_rule { get; set; } public string clip_rule { get; set; } public string d { get; set; } public string fill { get; set; } } // 初始化数组 Children = new object[] { new PathElement { name = "path", fill_rule = "evenodd" , clip_rule = "evenodd", d = "M8 16L3.54223 12.3383C1.93278 11.0162 1 9.04287 1 6.96005C1" + " 3.11612 4.15607 0 8 0C11.8439 0 15 3.11612 15 6.96005C15" + " 9.04287 14.0672 11.0162 12.4578 12.3383L8 16ZM3 6H5C6.10457" + " 6 7 6.89543 7 8V9L3 7.5V6ZM11 6C9.89543 6 9 6.89543 9 8V9L13 7.5V6H11Z", fill = "#000000" } };
方案3:检查OptiX的.NET兼容性
OptiX 1.6.2.36可能对特定.NET版本存在兼容性问题,尝试匹配OptiX官方推荐的.NET版本(比如降级到.NET Framework或特定.NET Core版本),避免版本不匹配导致的类型处理异常。
内容的提问来源于stack exchange,提问作者SPlatten
相关产品推荐
相关产品推荐

