質問

次のコードを検討してください。

Object obj;
PropertyDescriptorCollection A = TypeDescriptor.GetProperties(obj);
PropertyInfo[] B = obj.GetType().GetProperties(); // EDIT*

AとBの違いを理解しようとしています。 TypeDescriptor.GetProperties()の理解から、 TypeDescriptor のカスタムプロパティが返されます。 Type.GetProperties()は、組み込みの" real"のみを返します。オブジェクトのプロパティ。これは正解? objにカスタムの TypeDescriptor プロパティがない場合、デフォルトではオブジェクトのリテラルの組み込みプロパティも返されます。


*オリジナル EDITの前のコードの2行目(戻り値が間違っていた):

  

PropertyDescriptorCollection B = obj.GetType()。GetProperties();

役に立ちましたか?

解決

obj.GetType()。GetProperties() PropertyDescriptorCollection を返さず、 System.Reflection.PropertyInfo [] を返します。あなたが提案するように、 PropertyInfo クラスは、オブジェクトで作成された実際のプロパティのみを表します。 PropertyDescriptor は、 PropertyDescriptor クラスのカスタムコンクリートの子(カスタム記述子を定義する型によって実装される)であるか、シールされた内部クラス ReflectPropertyDescriptorのインスタンスです。 PropertyInfo クラスを使用して、プロパティの動的呼び出しを提供します。

したがって、カスタム記述子を定義しないクラスの場合、機能的には同じオブジェクトを取得しますが、 PropertyDescriptor PropertyInfo を抽象化します。

他のヒント

TypeDescriptor クラスは、設計者が設計時環境と対話できるように設計者で使用されます。特に、デザイナーは TypeDescriptor のさまざまな機能をオーバーライドおよび拡張できますが、 Type はできません。

1つの良い例は、データバインドコントロールを使用することです。 DataSource プロパティのタイプは System.Object ですが、デザインタイムでは、そのプロパティはより豊富なデザインタイムUIを持つ新しいプロパティに置き換えられます。

TypeDescriptor クラスは、 obj 型のプロパティを表す PropertyDescriptor オブジェクトと、それに貢献した他のプロパティを返します。オブジェクト自体またはそのタイプ。

コンポーネントモデルは実際には非常に複雑ですが、説明するように、 TypeDescriptor.GetProperties()の基本的な実装は ReflectPropertyDescriptor インスタンスは、典型的な PropertyInfo オブジェクトへの間接参照を表します。 PropertyInfo オブジェクトと非常によく似た PropertyDescriptor オブジェクトを使用できます。これらは、プロパティの値を取得および設定するために使用でき、属性を持ちます。

WPFの DependencyObject インスタンスの場合、 TypeDescriptor.GetProperties()は添付プロパティも返します。この場合、これらの PropertyDescriptor オブジェクトは、リフレクションではなく、依存関係オブジェクトモデルへの間接参照を提供します。

コンポーネントデザイナでは、 ICustomTypeDescriptor または TypeDescriptionProviderAttribute (およびその他の手法)を使用して、独自の PropertyDescriptor オブジェクトを作成できます。実行時または設計時。いずれの場合も、コンテキストによっては、 Type.GetProperties()から返されるプロパティが TypeDescriptor から返されるプロパティと非常に異なる場合があります。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top