我有一个文本框和一个自定义属性为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
,则不会计算第二个操作数。