次の方法で共有


System.Type.GetProperty メソッド

この記事では、この API のリファレンス ドキュメントに補足的な解説を提供します。

次のガイダンスは、すべてのオーバーロードに適用されます。

  • パブリックなアクセサーが少なくとも 1 つ存在する場合、プロパティはリフレクションに対してパブリックと見なされます。 それ以外の場合、プロパティはプライベートと見なされ、 BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.Static (Visual Basic では、 Orを使用して値を結合) を使用して取得する必要があります。
  • 現在の Type が構築されたジェネリック型を表す場合、このメソッドは、適切な型引数に置き換えられた型パラメーターで PropertyInfo を返します。
  • 現在の Type がジェネリック型またはジェネリック メソッドの定義で型パラメーターを表す場合、このメソッドはクラス制約のプロパティを検索します。

GetProperty(String) メソッド

nameの検索では、大文字と小文字が区別されます。 この検索には、パブリック静的プロパティとパブリック インスタンス プロパティが含まれます。

AmbiguousMatchExceptionが発生する状況は次のとおりです。

  • 型には、同じ名前と異なる数のパラメーターを持つ 2 つのインデックス付きプロパティが含まれています。 あいまいさを解決するには、パラメーター型を指定する GetProperty メソッドのオーバーロードを使用します。
  • 派生型は、 new 修飾子 (Visual Basic でShadows ) を使用して、同じ名前の継承されたプロパティを非表示にするプロパティを宣言します。 あいまいさを解決するには、 GetProperty(String, BindingFlags) メソッドのオーバーロードを使用し、 BindingFlags.DeclaredOnly フラグを追加して、継承されていないメンバーに検索を制限します。

GetProperty(String, BindingFlags) メソッド

次の BindingFlags フィルター フラグを使用して、検索に含めるプロパティを定義できます。

  • 戻り値を取得するには、 BindingFlags.Instance または BindingFlags.Static を指定する必要があります。
  • 検索にパブリック プロパティを含める BindingFlags.Public を指定します。
  • BindingFlags.NonPublicを指定して、非パブリック プロパティ (プライベート、内部、および保護されたプロパティ) を検索に含めます。
  • publicおよびprotected静的メンバーを階層に含めるBindingFlags.FlattenHierarchyを指定します。継承されたクラスprivate静的メンバーは含まれません。

次の BindingFlags 修飾子フラグを使用して、検索の動作を変更できます。

  • BindingFlags.IgnoreCase をクリックすると、 nameの大文字と小文字が無視されます。
  • BindingFlags.DeclaredOnly は、単に継承されたプロパティではなく、 Typeで宣言されたプロパティのみを検索します。

AmbiguousMatchExceptionが発生する状況は次のとおりです。

  • 型には、同じ名前と異なる数のパラメーターを持つ 2 つのインデックス付きプロパティが含まれています。 あいまいさを解決するには、パラメーター型を指定する GetProperty メソッドのオーバーロードを使用します。
  • 派生型は、 new 修飾子 (Visual Basic のShadows ) を使用して、同じ名前の継承されたプロパティを非表示にするプロパティを宣言します。 あいまいさを解決するには、検索を継承されていないメンバーに制限する BindingFlags.DeclaredOnly を含めます。

GetProperty(System.String, System.Reflection.BindingFlags, System.Reflection.Binder, System.Type, System.Type[], System.Reflection.ParameterModifier[]) メソッド

既定のバインダーは ParameterModifier ( modifiers パラメーター) を処理しませんが、抽象 System.Reflection.Binder クラスを使用して、 modifiersを処理するカスタム バインダーを記述できます。 ParameterModifier は COM 相互運用機能を介して呼び出すときにのみ使用され、参照渡しのパラメーターのみが処理されます。

次の表は、型に反映するときに、 Get メソッドによって返される基底クラスのメンバーを示しています。

メンバーの型 スタティック 非静的
コンストラクタ いいえ いいえ
フィールド いいえ はい。 フィールドは常に名前と署名で非表示になります。
出来事 適用なし 一般的な型システムルールは、継承がプロパティを実装するメソッドの継承と同じであるということです。 リフレクションは、プロパティを名前と署名による非表示として扱います。2
メソッド いいえ はい。 メソッド (仮想と非仮想の両方) は、名前で非表示にすることも、名前と署名で非表示にすることもできます。
入れ子になった型 いいえ いいえ
プロパティ 適用なし 一般的な型システムルールは、継承がプロパティを実装するメソッドの継承と同じであるということです。 リフレクションは、プロパティを名前と署名による非表示として扱います。2

注記:

  • 名前と署名による非表示は、カスタム修飾子、戻り値の型、パラメーター型、sentinel、アンマネージド呼び出し規則など、署名のすべての部分を考慮します。 これはバイナリ比較です。
  • リフレクションの場合、プロパティとイベントは名前と署名によって非表示になります。 基底クラスに get アクセサーと set アクセサーの両方を持つプロパティがあるが、派生クラスに get アクセサーしかない場合、派生クラス プロパティは基底クラス プロパティを非表示にし、基底クラスのセッターにアクセスすることはできません。
  • カスタム属性は、共通型システムの一部ではありません。

次の BindingFlags フィルター フラグを使用して、検索に含めるプロパティを定義できます。

  • 戻り値を取得するには、 BindingFlags.Instance または BindingFlags.Static を指定する必要があります。
  • 検索にパブリック プロパティを含める BindingFlags.Public を指定します。
  • BindingFlags.NonPublicを指定して、非パブリック プロパティ (プライベート、内部、および保護されたプロパティ) を検索に含めます。
  • publicおよびprotected静的メンバーを階層に含めるBindingFlags.FlattenHierarchyを指定します。継承されたクラスprivate静的メンバーは含まれません。

次の BindingFlags 修飾子フラグを使用して、検索の動作を変更できます。

  • BindingFlags.IgnoreCase をクリックすると、 nameの大文字と小文字が無視されます。
  • BindingFlags.DeclaredOnly は、単に継承されたプロパティではなく、 Typeで宣言されたプロパティのみを検索します。

インデクサーと既定のプロパティ

Visual Basic、C#、および C++ では、インデックス付きプロパティにアクセスするための構文が簡略化され、1 つのインデックス付きプロパティがその型の既定値になります。 たとえば、変数 myListArrayListを参照している場合、構文 myList[3] (Visual Basic のmyList(3) ) は、インデックスが 3 の要素を取得します。 プロパティをオーバーロードできます。

C# では、この機能はインデクサーと呼ばれ、名前で参照することはできません。 既定では、C# インデクサーは、 Itemという名前のインデックス付きプロパティとしてメタデータに表示されます。 ただし、クラス ライブラリ開発者は、 IndexerNameAttribute 属性を使用して、メタデータ内のインデクサーの名前を変更できます。 たとえば、 String クラスには、 Chars[]という名前のインデクサーがあります。 C# 以外の言語を使用して作成されたインデックス付きプロパティには、 Item以外の名前を付けることもできます。

型に既定のプロパティがあるかどうかを判断するには、 GetCustomAttributes(Type, Boolean) メソッドを使用して DefaultMemberAttribute 属性をテストします。 型に DefaultMemberAttributeがある場合、 MemberName プロパティは既定のプロパティの名前を返します。