【问题标题】:What's the interest of PropertyGrid.BrowsableAttributes?PropertyGrid.BrowsableAttributes 有什么好处?
【发布时间】:2016-08-24 12:11:58
【问题描述】:

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

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

起初我认为这将能够遍历您的SelectedObject 中的每个BrowsableAttribute,然后您将能够找到原始属性,这将很有用。

但不,显然这个属性所做的只是给你一个AttributeCollection,只包含BrowsableAttribute,全部设置为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。我只知道它是另一个我知道的派生类。但我对备份从属性网格获得的对象属性很感兴趣,以便以后能够保存和加载它们。

由于属性网格已经包含所有这些值,我认为这种属性可能是编写更多代码的捷径。我不想在 Property Grid 已经完成的情况下使用反射来检查代码。

【问题讨论】:

  • 你为什么想要使用它?您是否正在尝试解决一些问题(哪个?)并认为可以使用此属性还是学术问题“RandomClass.RandomProperty 有什么用处”?答案在关于PropertyGridmsdn 的教程中。
  • @Sinatr 我更新了我的问题,但答案不在教程中,我已经在那些 msdn 页面上花了一些时间来弄清楚。
  • “我不知道在属性中选择了哪个对象” - 又是XY problem为什么您需要知道这一点?做什么? PropertyGrid.SelectedObject是对象,可以使用is或者GetType()来判断类型。
  • @Sinatr 再次更新。我可以再次解释为什么我需要从 DLL 中探索一个对象,但这会要求我完全解释我的项目......我试图将问题缩小到相关的范围......
  • PropertyGrid 使用TypeDescriptor 机制使用TypeDescriptor.GetProperties(component, attributes) 获取SelectedObject 的属性。该方法根据传递的属性返回传递的对象的过滤属性。如文档中所述,只有属性与指定值匹配的属性才会显示在 PropertyGrid 中。默认值为仅包含 BrowsableAttribute.Yes. 的 AttributeCollection。您可以在答案中找到更多描述和一些链接。

标签: c# .net vb.net winforms propertygrid


【解决方案1】:

PropertyGrid 使用类似于to this answer 的方法迭代对象的所有属性。在执行此操作时,它会检查与该属性关联的所有属性,并检查它是否可以找到与 AttributeCollection 的匹配项(示例代码,如何做到这一点is here)。如果它可以找到它,它会显示在属性网格中,否则不会。

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

【讨论】:

  • 感谢您的回答。我了解 PropertyGrid 是如何找到它的,问题是 ProeprtyGrid.BrowsableAttributes 只包含设置为 Yes 的 BrowsableAttributes,那么这有什么用呢?
  • @SuperPeanut 的东西默认是可浏览的; IIRC 这个被当作一种特殊情况处理 - 但您可以添加 您自己的 过滤器以使其以不同方式工作
  • @SuperPeanut:解释在我的第二段。它定义了必须将哪个属性附加到属性以使其在属性网格中可见。如果您喜欢关于哪些属性应显示在网格中的白名单方法,您可以替换它。
  • @Oliver 好的,我想我现在明白了。非常感谢你。我完全误解了这个属性。
【解决方案2】:

BrowsableAttributes 属性的作用已在文档中明确描述:

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

但它是如何工作的?

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

  • 反射 API
  • TypeDescriptor 机制

通过反射返回的类型的元数据是不可扩展的,并且在编译类型后无法修改,而通过TypeDescriptor返回的元数据可以使用IExtenderProviderITypeDescriptorFilterServiceICustomTypeDescriptor更改。

例如,这是一种类型描述机制,它使设计者能够添加一些设计时属性,这些属性不是对象的实际属性,例如ModifierLockedGenerateMember

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

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

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

上述方法中的componentPropertyGridSelectedObjectattributesBrowsableAttributes 属性,如文档中所述,只有属性与指定值匹配的属性才会显示在PropertyGrid 中。由于默认情况下基于约定,我们希望具有[Brawsable(false)] 的属性不会显示在PropertyGrid 中,因此该属性包含具有Yes 值的Browsable 属性。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-01-04
    • 2010-11-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-11-05
    相关资源
    最近更新 更多