TypeDescriptor.GetProperties()vs Type.GetProperties()
-
05-07-2019 - |
質問
次のコードを検討してください。
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
から返されるプロパティと非常に異なる場合があります。