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

时间:2015-10-14 16:31:18

标签: c# reflection

我有一个文本框和一个带有自定义属性的数据网格视图。我使用反射在运行时启用文本框或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;
    }

2 个答案:

答案 0 :(得分:1)

if (property.Name == PropName & Convert.ToBoolean(property.GetValue(control, null)) == true)

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

在第二个示例中,在匹配属性上尝试GetValue,因此永远不会在第一个循环中抛出异常的属性上调用GetValue。 / p>

答案 1 :(得分:1)

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

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