如何让VB.NET组件属性重置方法支持排除多个属性?
问题分析与解决方案
你遇到的问题核心是条件判断逻辑错误:当ExcludedProperties改为String()数组后,你用item.Name IsNot ExcludedProperties进行判断,这是把字符串和数组对象做比较,永远都会返回True,所以所有属性都会被保留,排除功能自然失效。
修正后的代码
我们需要修改Where子句的判断逻辑,检查当前属性名是否不在排除数组中,具体可以用Array.Contains()方法来实现:
Public Shared Sub ResetPropertiesByComponent(ByVal Component As Component, ByVal ExcludedProperties As String()) Dim PropertyCollection As List(Of PropertyDescriptor) = TypeDescriptor.GetProperties(Component).OfType(Of PropertyDescriptor) _ .Where(Function(item) Not ExcludedProperties.Contains(item.Name)) _ .ToList() For Each _PropertyDescriptor As PropertyDescriptor In PropertyCollection If _PropertyDescriptor.CanResetValue(Component) Then ' 修正原代码中的笔误:_Control 改为 Component If _PropertyDescriptor.GetValue(Component) IsNot Nothing Then _PropertyDescriptor.ResetValue(Component) End If End If Next End Sub
性能优化建议(可选)
如果需要排除的属性数量较多,建议把数组转换成HashSet(Of String),这样查找性能会大幅提升(数组的Contains是线性查找,HashSet是O(1)常数级查找):
Public Shared Sub ResetPropertiesByComponent(ByVal Component As Component, ByVal ExcludedProperties As String()) ' 转换成HashSet,支持忽略大小写(按需调整) Dim excludedSet As New HashSet(Of String)(ExcludedProperties, StringComparer.OrdinalIgnoreCase) Dim PropertyCollection As List(Of PropertyDescriptor) = TypeDescriptor.GetProperties(Component).OfType(Of PropertyDescriptor) _ .Where(Function(item) Not excludedSet.Contains(item.Name)) _ .ToList() For Each _PropertyDescriptor As PropertyDescriptor In PropertyCollection If _PropertyDescriptor.CanResetValue(Component) Then If _PropertyDescriptor.GetValue(Component) IsNot Nothing Then _PropertyDescriptor.ResetValue(Component) End If End If Next End Sub
额外注意点
原代码里还有一个小笔误:_PropertyDescriptor.ResetValue(_Control)中的_Control应该是参数Component,否则会出现变量未定义的编译错误,我已经在修正代码中统一改为Component了。
现在调用Call ResetPropertiesByComponent(Me, {"ClientSize", "MinimumSize"})就能正常生效,成功排除指定的多个属性。
内容的提问来源于stack exchange,提问作者Simos Sigma
相关产品推荐
相关产品推荐

