PropertyGrid.BrowsableAttributes 的兴趣是什么?
What's the interest of PropertyGrid.BrowsableAttributes?
NB : This question is tagged C# too as it is a general question and an
answer describing the use of this in C# is perfectly fine to me.
我最近一直在研究 .Net Framework 中的 属性Grid。我检查过这个 属性 (BrowsableAttributes) 但我不知道它的用途。
起初我认为这将能够遍历您的 SelectedObject
中的每个 BrowsableAttribute
然后您将能够找到原来的 属性,这会很有用.
但是不,显然 属性 所做的只是给你一个只包含 BrowsableAttribute
的 AttributeCollection
,全部设置为 True
...
有人能告诉我这种方法有什么意义吗?我什至不明白它在 .NET 中有什么用...
Dim attributes = MyPropertyGrid.BrowsableAttributes
For Each A As Attribute In attributes
Dim Browsable As BrowsableAttribute = CType(A, BrowsableAttribute)
'Then how can I use this ? it's only property is Browsable (True/False)
Next
我最初试图解决一个问题,我不知道在 属性 网格中选择了哪个对象,但我想收集该对象的数据。
我不知道对象的类型是什么,因为它来自动态加载的 DLL。我只知道它是另一个我知道的派生 class。但我对备份从 属性 网格中获得的对象属性感兴趣,以便以后能够保存和加载它们。
由于 属性 网格已经包含所有这些值,我认为这种 属性 可能是编写更多代码的捷径。我不想使用反射来检查代码,而 属性 网格已经做到了。
PropertyGrid 使用类似于 to this answer. While it does it, it checks all attributes associated with that property and checks if it can find a match with the AttributeCollection (sample code, how this can be done is here) 的方法遍历对象的所有属性。如果它能找到它,它将出现在 属性 网格中,否则不会。
目的是,如果您需要黑名单支持,您可以通过使用 [Browsable(false)]
标记来隐藏 public 属性以显示在 属性 网格中。如果您喜欢白名单方法,您可以定义自己的属性,将其应用于所有需要的属性并将 BrowsableAttribute
设置为仅包含您自己的属性的集合。
BrowsableAttributes
属性 的工作在文档中有清楚的描述:
Only properties with attributes matching the values specified are
displayed in the PropertyGrid. The default is an AttributeCollection
containing only BrowsableAttribute.Yes.
但是它是如何工作的呢?
.NET Framework 有两种机制来查找某种类型的元数据:
- 反射 API
- TypeDescriptor 机制
通过类型反射 returns 的元数据不可扩展,在类型编译后无法修改,而 TypeDescriptor
returns 的元数据可以使用 IExtenderProvider
、ITypeDescriptorFilterService
或 ICustomTypeDescriptor
。
例如,这是类型描述机制,它使设计者能够添加一些设计时属性,这些属性不是对象的实际属性,例如 Modifier
、Locked
或 GenerateMember
.
PropertyGrid
使用 TypeDescriptor
机制以这种方式获取属性:
var properties = TypeDescriptor.GetProperties(component, attributes);
依赖于TypeDescriptor.GetProperties
方法,您可以在文档的备注部分找到过滤规则。
上述方法中的 component
是 PropertyGrid
的 SelectedObject
并且 attributes
是 BrowsableAttributes
属性 并且如文档中所述仅属性与指定值匹配的属性显示在 PropertyGrid
中。由于默认情况下基于约定,我们期望具有 [Brawsable(false)]
的属性不会显示在 PropertyGrid
中,因此 属性 包含具有 Yes
值的 Browsable
属性。
NB : This question is tagged C# too as it is a general question and an answer describing the use of this in C# is perfectly fine to me.
我最近一直在研究 .Net Framework 中的 属性Grid。我检查过这个 属性 (BrowsableAttributes) 但我不知道它的用途。
起初我认为这将能够遍历您的 SelectedObject
中的每个 BrowsableAttribute
然后您将能够找到原来的 属性,这会很有用.
但是不,显然 属性 所做的只是给你一个只包含 BrowsableAttribute
的 AttributeCollection
,全部设置为 True
...
有人能告诉我这种方法有什么意义吗?我什至不明白它在 .NET 中有什么用...
Dim attributes = MyPropertyGrid.BrowsableAttributes
For Each A As Attribute In attributes
Dim Browsable As BrowsableAttribute = CType(A, BrowsableAttribute)
'Then how can I use this ? it's only property is Browsable (True/False)
Next
我最初试图解决一个问题,我不知道在 属性 网格中选择了哪个对象,但我想收集该对象的数据。
我不知道对象的类型是什么,因为它来自动态加载的 DLL。我只知道它是另一个我知道的派生 class。但我对备份从 属性 网格中获得的对象属性感兴趣,以便以后能够保存和加载它们。
由于 属性 网格已经包含所有这些值,我认为这种 属性 可能是编写更多代码的捷径。我不想使用反射来检查代码,而 属性 网格已经做到了。
PropertyGrid 使用类似于 to this answer. While it does it, it checks all attributes associated with that property and checks if it can find a match with the AttributeCollection (sample code, how this can be done is here) 的方法遍历对象的所有属性。如果它能找到它,它将出现在 属性 网格中,否则不会。
目的是,如果您需要黑名单支持,您可以通过使用 [Browsable(false)]
标记来隐藏 public 属性以显示在 属性 网格中。如果您喜欢白名单方法,您可以定义自己的属性,将其应用于所有需要的属性并将 BrowsableAttribute
设置为仅包含您自己的属性的集合。
BrowsableAttributes
属性 的工作在文档中有清楚的描述:
Only properties with attributes matching the values specified are displayed in the PropertyGrid. The default is an AttributeCollection containing only BrowsableAttribute.Yes.
但是它是如何工作的呢?
.NET Framework 有两种机制来查找某种类型的元数据:
- 反射 API
- TypeDescriptor 机制
通过类型反射 returns 的元数据不可扩展,在类型编译后无法修改,而 TypeDescriptor
returns 的元数据可以使用 IExtenderProvider
、ITypeDescriptorFilterService
或 ICustomTypeDescriptor
。
例如,这是类型描述机制,它使设计者能够添加一些设计时属性,这些属性不是对象的实际属性,例如 Modifier
、Locked
或 GenerateMember
.
PropertyGrid
使用 TypeDescriptor
机制以这种方式获取属性:
var properties = TypeDescriptor.GetProperties(component, attributes);
依赖于TypeDescriptor.GetProperties
方法,您可以在文档的备注部分找到过滤规则。
上述方法中的 component
是 PropertyGrid
的 SelectedObject
并且 attributes
是 BrowsableAttributes
属性 并且如文档中所述仅属性与指定值匹配的属性显示在 PropertyGrid
中。由于默认情况下基于约定,我们期望具有 [Brawsable(false)]
的属性不会显示在 PropertyGrid
中,因此 属性 包含具有 Yes
值的 Browsable
属性。