Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 什么';What’PropertyGrid.BrowsableAttributes的利益是什么?_C#_.net_Vb.net_Winforms_Propertygrid - Fatal编程技术网

C# 什么';What’PropertyGrid.BrowsableAttributes的利益是什么?

C# 什么';What’PropertyGrid.BrowsableAttributes的利益是什么?,c#,.net,vb.net,winforms,propertygrid,C#,.net,Vb.net,Winforms,Propertygrid,注意:这个问题也被标记为C#,因为它是一个一般性问题,也是一个复杂的问题 在C#中描述这个用法的答案对我来说非常好 我最近一直在探索.Net框架中的PropertyGrid。我已经检查了这个属性(),不知道它的用途 起初,我认为这将能够循环通过SelectedObject中的每个BrowsableAttribute,然后您将能够找到原来有用的属性 但是没有,显然这个属性所做的只是给你一个AttributeCollection,它只包含BrowsableAttribute,全部设置为True 有人

注意:这个问题也被标记为C#,因为它是一个一般性问题,也是一个复杂的问题 在C#中描述这个用法的答案对我来说非常好

我最近一直在探索.Net框架中的PropertyGrid。我已经检查了这个属性(),不知道它的用途

起初,我认为这将能够循环通过
SelectedObject
中的每个
BrowsableAttribute
,然后您将能够找到原来有用的属性

但是没有,显然这个属性所做的只是给你一个
AttributeCollection
,它只包含
BrowsableAttribute
,全部设置为
True

有人能告诉我这种方法的意义吗?我甚至不明白它在.NET中是如何有用的

Dim attributes=MyPropertyGrid.BrowsableAttributes
对于属性中的每个As属性
作为BrowsableAttribute=CType(A,BrowsableAttribute)的可浏览尺寸
“那我怎么用这个呢?它的唯一属性是可浏览的(真/假)
下一个
我最初试图解决一个问题,我不知道在属性网格中选择了哪个对象,但我想收集对象的数据

我不知道对象的类型是什么,因为它来自动态加载的DLL。我只知道它是另一个的派生类,我知道。但我对备份从属性网格获得的对象属性很感兴趣,以便以后能够保存和加载它们


由于属性网格已经包含了所有这些值,我认为这种属性可以成为编写更多代码的工具。当属性网格已经检查代码时,我不想使用反射来检查代码。

属性网格使用类似的方法迭代对象的所有属性。执行此操作时,它会检查与该属性关联的所有属性,并检查是否可以找到与AttributeCollection匹配的属性(示例代码,如何完成此操作)。如果可以找到它,它将显示在属性网格中,否则不会

其目的是,如果需要黑名单支持,可以通过使用
[Browsable(false)]
标记公共属性来隐藏公共属性以显示在属性网格中。如果您喜欢白名单方法,您可以定义自己的属性,将其应用于所有所需的属性,并将
BrowsableAttribute
设置为仅包含自己属性的集合。

文档中明确描述了属性的工作:

只有属性与指定值匹配的属性才会被删除 显示在PropertyGrid中。默认值是AttributeCollection 仅包含BrowsableAttribute.Yes

但它是如何工作的?

.NET Framework有两种查找类型元数据的机制:

  • 反射API
  • 类型描述符机制
通过类型的反射返回的元数据是不可扩展的,在编译类型后无法修改,而通过
TypeDescriptor
返回的元数据可以使用
IExtenderProvider
ittypedescriptorfilterservice
ICustomTypeDescriptor
进行更改

例如,这是一种类型描述机制,使设计者能够添加一些设计时属性,这些属性不是对象的实际属性,例如
修改器
锁定
生成成员


PropertyGrid
使用
TypeDescriptor
机制以这种方式获取属性:

var properties = TypeDescriptor.GetProperties(component, attributes);
它依赖于您可以在文档的备注部分找到筛选规则的方法


上述方法中的
组件
属性网格
选择对象
属性
是属性,如文档所述,只有属性与指定值匹配的属性才会显示在
属性网格
中。由于默认情况下基于约定,我们希望具有
[Brawsable(false)]
的属性不会显示在
PropertyGrid
中,因此该属性包含一个
可浏览的
属性,该属性的值为
Yes

为什么要使用它?您是在试图解决一些问题(哪一个?)并思考这个属性可以被使用,还是学术问题“什么是
RandomClass.RandomProperty
对您有用”?答案在关于
PropertyGrid
的教程和中。@Sinatr我更新了我的问题,答案不在教程中,我已经花了一些时间在那些msdn页面上找到了答案。“我不知道属性中选择了哪个对象”-然后重复。你为什么要知道这些?做什么
PropertyGrid。SelectedObject
是对象,您可以使用
is
GetType()
来确定类型。@Sinatr再次更新。我可以再次解释为什么我需要从DLL中探索对象,但这会要求我完全解释我的项目。。。我试图将问题缩小到什么是相关的…
PropertyGrid
使用
TypeDescriptor
机制,使用
TypeDescriptor.GetProperties(组件、属性)
获取
SelectedObject
的属性。该方法基于传递的属性返回传递对象的过滤属性。如文档中所述,PropertyGrid中仅显示属性与指定值匹配的属性。默认值是仅包含BrowsableAttribute的AttributeCollection。是。。你可以在答案中找到更多描述和一些链接。谢谢你的回答。我理解PropertyGrid是如何找到它的,问题是ProeprtyGrid.BrowsableAttributes只包含设置为“是”的BrowsableAttributes,那么这有什么用处呢?@SuperPeanut默认情况下是可浏览的;IIRC这一个作为sp处理