2016-08-24 77 views
3

注意:这个问题也被标记为C#,因为它是一个普通的问题,描述在C#中使用这个问题的答案是对我来说完全没问题。PropertyGrid.BrowsableAttributes的兴趣是什么?

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

起初我以为这将能够遍历你的SelectedObject中的每个BrowsableAttribute,那么你将能够找回原来的属性,这将是有用的。

不过没有关系,显然这一切的属性不会是给你一个AttributeCollectionBrowsableAttribute含,全部设置为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。我只知道它是另一个派生类,我知道。但我很有兴趣备份从属性网格获得的对象的属性,以便稍后保存和加载它们。

由于属性网格已包含所有这些值,我认为这种属性可能是编写更多代码的快捷方式。 PropertyGrid已经做到了,我不想用反射来检查代码。

+1

你为什么要*使用它?你是否试图解决一些问题(哪一个?),并考虑可以使用这个属性或者是学术问题“RandomClass.RandomProperty对于什么是有用的”?答案是关于'PropertyGrid'和[msdn](https://msdn.microsoft.com/en-us/library/system.componentmodel.browsableattribute(v = vs.110).aspx)的教程中的某处。 – Sinatr

+0

@Sinatr我更新了我的问题,没有答案不在教程中,我花了一些时间在这些msdn页面上找出答案。 –

+1

*“我不知道属性中选择了哪个对象”* - 然后再次[XY问题](http://meta.stackexchange.com/q/66377/299295)。 **为什么**你需要知道这个?做什么? 'PropertyGrid.SelectedObject'是对象,您可以使用'is'或'GetType()'来确定类型。 – Sinatr

回答

3

BrowsableAttributes属性的作业已在单证描述清楚:与属性匹配指定的值

只有性质在PropertyGrid中显示 。默认值为仅包含BrowsableAttribute.Yes的AttributeCollection 。

但它是如何工作的?

The。.NET框架具有两个机构找到的类型的元数据:

  • 反射的API
  • TypeDescriptor机构

这对于一个类型返回由反射元数据是不可扩展的和的编译后不能被修改类型,而返回TypeDescriptor的元数据可以使用IExtenderProvider,ITypeDescriptorFilterServiceICustomTypeDescriptor进行更改。

例如,这是类型描述机构,其使设计增加一些其不是像ModifierLockedGenerateMember对象的实际特性设计时属性。

PropertyGrid使用TypeDescriptor机制来获取属性这样:

var properties = TypeDescriptor.GetProperties(component, attributes); 

依赖于TypeDescriptor.GetProperties方法,你可以找到过滤规则在文档的备注部分。

在上述方法中的componentPropertyGridSelectedObjectattributesBrowsableAttributes属性并且如在单证唯一属性相匹配的所指定的值的属性描述显示在PropertyGrid。由于默认情况下基于约定,我们预计中不显示属性[Brawsable(false)],因此该属性包含Browsable属性和Yes值。

4

PropertyGrid使用类似to this answer的方法迭代对象的所有属性。虽然这样做,它会检查与该属性关联的所有属性,并检查它是否可以找到与AttributeCollection(示例代码,如何完成is here)的匹配。如果它能找到它,它将显示在属性网格中,否则不会。

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

+0

谢谢你的回答。我明白PropertyGrid如何发现它,问题是ProeprtyGrid.BrowsableAttributes只包含BrowsableAttributes设置为Yes,那么这是如何有用的? –

+0

@SuperPeanut默认情况下可浏览; IIRC这个有点作为特例处理 - 但你可以添加**你自己的**过滤器,使其工作方式不同 –

+0

@SuperPeanut:解释在我的第二段。它定义哪个属性必须附加到属性以使其在属性网格中可见。如果您喜欢关于哪些属性应显示在网格中的白名单方法,则可以将其替换。 – Oliver