C#反射控件属性参数计数不匹配异常

C# reflection control properties parameter count mismatch exception

我有一个文本框和一个带有自定义 属性 布尔值的数据网格视图。我使用反射在运行时启用文本框或数据网格视图,具体取决于我的自定义 属性 的设置方式。代码循环遍历每个控件属性,如果它是我的自定义 属性 和 true,那么我启用控件。

我仅在 datagridview 上遇到 "Parameter count mismatch" 异常。 我找到了解决方法,但我不确定它为什么有效。下面的第一个 foreach 循环抛出异常。第二个没有。

我进行了一些搜索,我发现 属性 是一个索引器。我知道它不是,属性 的 GetIndexParameters().Length 对于两种控件类型都是 0。为什么第一个示例不起作用?

    Type type = control.GetType();
    PropertyInfo[] properties = type.GetProperties();

    //Exception
    foreach (PropertyInfo property in properties)
    {
        if (property.Name == PropName & Convert.ToBoolean(property.GetValue(control, null)) == true)
            (control as Control).Enabled = true;
    }

    //No excpetion
    foreach (PropertyInfo property in properties)
    {
        if (property.Name == PropName)
            if(Convert.ToBoolean(property.GetValue(control, null)) == true)
                (control as Control).Enabled = true;
    }
if (property.Name == PropName & Convert.ToBoolean(property.GetValue(control, null)) == true)

您正在使用 & 而不是 &&,这意味着您正尝试在 每个 属性 上执行 GetValue , 不管名字.

在第二个示例中,您 尝试 GetValue 匹配 属性,因此 GetValue 永远不会在 属性 在第一个循环中抛出异常。

你用的是单根&,不会短路。这意味着无论 property.Name == PropName 的结果如何,它总是会评估第二个操作数,在本例中是您的 Convert.ToBoolean(property.GetValue(control, null)) == true 语句。

使用双符号 && 短路,如果第一个结果为 false,则不会计算第二个操作数。