【问题标题】:C# reflection control properties parameter count mismatch exceptionC#反射控制属性参数计数不匹配异常
【发布时间】:2015-10-14 16:31:17
【问题描述】:

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

我仅在 datagridview 上遇到“参数计数不匹配”异常。 我找到了解决方法,但我不确定它为什么会起作用。下面的第一个 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;
    }

【问题讨论】:

    标签: c# reflection


    【解决方案1】:
    if (property.Name == PropName & Convert.ToBoolean(property.GetValue(control, null)) == true)
    

    您使用的是& 而不是&&,这意味着您尝试在每个 属性上执行GetValue,无论名称如何。

    在第二个示例中,您在匹配的属性上尝试GetValue,因此在第一个循环中引发异常的属性上永远不会调用GetValue

    【讨论】:

      【解决方案2】:

      您使用了不会短路的单个&。这意味着无论property.Name == PropName 的结果如何,它都会评估第二个操作数,在这种情况下是您的Convert.ToBoolean(property.GetValue(control, null)) == true 语句。

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-11-17
        • 1970-01-01
        • 2018-02-14
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-11-17
        • 1970-01-01
        相关资源
        最近更新 更多