2016-08-24 8 views
3

NB:この質問は一般的な質問と同様にタグが付けられており、 答えはC#でこれを使用することを説明するもので、私にとって完璧です。PropertyGrid.BrowsableAttributesの興味は?

最近、.NET FrameworkでPropertyGridを調べています。私はこのプロパティ(BrowsableAttributes)をチェックしていますが、私はそれを使用することは考えていません。

最初に私はあなたのSelectedObjectの中でBrowsableAttributeのすべてをループすることができると思っていました。元のプロパティーを見つけることができれば便利でしょう。

しかし、いや、どうやらすべてこのプロパティは、誰かがそのような方法のためのポイントが何であるかに私を啓発することができます...あなたの

のみBrowsableAttributeTrueに設定されているすべてを含むAttributeCollectionを与えているのでしょうか?私も...それは.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に由来するため、オブジェクトの型が何であるかわかりません。私はそれが別のものの派生クラスであることを知っているだけです。しかし、後で保存してロードできるように、プロパティグリッドから取得したオブジェクトのプロパティをバックアップするのは面白いです。

プロパティグリッドにはすでにこれらの値がすべて含まれているので、この種のプロパティはより多くのコードを書くためのショールカットになると思いました。私は、プロパティグリッドが既にそれを行っている間に、コードを検査するためにリフレクションを使用したくありません。

+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 です。

どのように機能しますか?

  • リフレクションAPI
  • TypeDescriptor機構

タイプに対して反射によって返さメタデータは拡張可能ではないとのコンパイル後に変更することはできません:NET Frameworkは、タイプのメタデータを見つけるための2つのメカニズムを有していますTypeDescriptorで返されるメタデータは、IExtenderProvider,ITypeDescriptorFilterService、またはICustomTypeDescriptorを使用して変更できます。

たとえば、Modifier,LockedまたはGenerateMemberのようなオブジェクトの実際のプロパティではないデザインタイムプロパティを設計者が追加できるようにするのは、このタイプの記述メカニズムです。

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

ドキュメントの備考セクションにフィルタリングルールを見つけることができますTypeDescriptor.GetProperties方法に依存しています:

PropertyGrid

は、プロパティをこのように得るために TypeDescriptorメカニズムを使用しています。上記方法では、 component PropertyGridSelectedObjectattributesある

BrowsableAttributes特性であり、指定された値と一致する属性を持つドキュメンテーションにプロパティのみを記載したようにPropertyGridに表示されます。デフォルトでは、慣習に基づいて[Brawsable(false)]のプロパティはPropertyGridに表示されないため、属性にはYesの値が含まれています。

4

PropertyGridは、同様の方法を使用してオブジェクトのすべてのプロパティを反復処理します。to this answerそれが実行されている間、そのプロパティに関連付けられているすべての属性をチェックし、AttributeCollection(サンプルコード、これがどのように実行できるかis here)と一致するかどうかを調べます。見つけられれば、プロパティグリッドに表示されます。それ以外の場合は表示されません。

ブラックリストのサポートが必要な場合は、パブリックプロパティを非表示にしてプロパティグリッドに表示するか、[Browsable(false)]とマークすることができます。ホワイトリストアプローチが好きな場合は、独自の属性を定義してそれをすべてのプロパティに適用し、BrowsableAttributeを独自の属性のみを含むコレクションに設定することができます。

+0

ありがとうございます。私はPropertyGridがそれを見つけた方法を理解しています。問題は、ProeprtyGrid.BrowsableAttributesにはBrowsableAttributesのみがYesに設定されていることです。これはどのように役立ちますか? –

+0

@SuperPeanutはデフォルトで閲覧可能です。 IIRCこれは特別なケースとして扱われますが、独自の**フィルタを追加して別の方法で動作させることができます –

+0

@SuperPeanut:説明は私の第2段落にあります。プロパティグリッドに表示するためには、プロパティにアタッチする必要のある属性を定義します。プロパティをグリッドに表示するホワイトリストアプローチが好きな場合は、置き換えることができます。 – Oliver

関連する問題