c#反射控制属性参数计数不匹配异常



我有一个文本框和一个自定义属性为bool的datagridview。我使用反射在运行时启用文本框或datagridview,这取决于我的自定义属性是如何设置的。代码循环遍历每个控件的属性,如果它是我的自定义属性并且为true,则启用该控件。

我只在datagridview上得到一个"参数计数不匹配"异常。我已经找到了一个工作,但我不知道为什么它的工作。下面的第一个foreach循环抛出一个异常。第二个则不然。

我已经做了一些搜索,我发现指向属性是一个索引器。我知道它不是和GetIndexParameters()。两个控件类型的属性长度都为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,则不会计算第二个操作数。

相关内容

  • 没有找到相关文章

最新更新