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

使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.12 15:53:18