我有一个文本框和一个带有自定义属性的数据网格视图。我使用反射在运行时启用文本框或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;
}
答案 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
,则不会评估第二个操作数。