C#反射控件属性参数计数不匹配异常
C# reflection control properties parameter count mismatch exception
我有一个文本框和一个带有自定义 属性 布尔值的数据网格视图。我使用反射在运行时启用文本框或数据网格视图,具体取决于我的自定义 属性 的设置方式。代码循环遍历每个控件属性,如果它是我的自定义 属性 和 true,那么我启用控件。
我仅在 datagridview 上遇到 "Parameter count mismatch" 异常。 我找到了解决方法,但我不确定它为什么有效。下面的第一个 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;
}
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
,则不会计算第二个操作数。
我有一个文本框和一个带有自定义 属性 布尔值的数据网格视图。我使用反射在运行时启用文本框或数据网格视图,具体取决于我的自定义 属性 的设置方式。代码循环遍历每个控件属性,如果它是我的自定义 属性 和 true,那么我启用控件。
我仅在 datagridview 上遇到 "Parameter count mismatch" 异常。 我找到了解决方法,但我不确定它为什么有效。下面的第一个 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;
}
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
,则不会计算第二个操作数。