情報
要求されたトピックは次のとおりです。しかし、このトピックはこのライブラリには含まれていません。

Type.GetMethod メソッド (String, BindingFlags, Binder, CallingConventions, Type[], ParameterModifier[])

2013/12/12

指定したバインディング制約および指定した呼び出し規約を使用して、指定したメソッドのうち、指定した引数の型および修飾子と一致するパラメーターが設定されているものを検索します。

Namespace:  System
アセンブリ:  mscorlib (mscorlib.dll 内)

public MethodInfo GetMethod(
	string name,
	BindingFlags bindingAttr,
	Binder binder,
	CallingConventions callConvention,
	Type[] types,
	ParameterModifier[] modifiers
)

パラメーター

name
型: System.String
取得するメソッドの名前を格納している String
bindingAttr
型: System.Reflection.BindingFlags
検索の実行方法を指定する 1 つ以上の BindingFlags から成るビットマスク。
または
null を返す 0。
binder
型: System.Reflection.Binder
一連のプロパティを定義し、バインディングを有効にする Binder オブジェクト。バインディングには、オーバーロードされたメソッドの選択、引数の型の強制変換、リフレクションによるメンバーの呼び出しなどが含まれます。
または
DefaultBinder を使用する場合は null 参照 (Visual Basic では Nothing)。
callConvention
型: System.Reflection.CallingConventions
引数の順序とレイアウト、戻り値を渡す方法、引数を格納するレジスタ、スタックのクリーンアップの方法に関する一連の規則を指定する CallingConventions オブジェクト。
types
型: System.Type []
取得するメソッドのパラメーターの数、順序、および型を表す Type オブジェクトの配列。
または
パラメーターをとらないメソッドを取得するための Type オブジェクトの空の配列 (EmptyTypes フィールドで指定)。
modifiers
型: System.Reflection.ParameterModifier []
types 配列内の対応する要素に関連付けられている属性を表す ParameterModifier オブジェクトの配列。COM 相互運用機能によって呼び出すときにのみ使用され、参照渡しされるパラメーターのみが処理されます。既定のバインダーは、このパラメーターを処理しません。

戻り値

型: System.Reflection.MethodInfo
指定した要件と一致するメソッドが見つかった場合は、そのメソッドを表す MethodInfo オブジェクト。それ以外の場合は null

例外条件
AmbiguousMatchException

指定した名前を持ち、指定したバインディング制約に一致するメソッドが 2 つ以上存在します。

ArgumentNullException

namenull です。

または

typesnull です。

または

types の要素の 1 つが null です。

ArgumentException

types が多次元です。

または

modifiers が多次元です。

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

型に対するリフレクション時に GetXXX メソッドによって返される基本クラスのメンバーを次の表に示します。

メンバー型

静的

非静的

コンストラクター

いいえ

いいえ

フィールド

いいえ

はい。フィールドは常に名前と署名によって隠ぺいされます。

イベント

該当なし

共通型システムの規則では、継承は、プロパティを実装するメソッドの継承と同じになります。リフレクションは、プロパティを名前と署名によって隠ぺいされているとして扱います。下記のメモ 2 を参照してください。

メソッド

いいえ

はい。メソッド (仮想メソッドと非仮想メソッドの両方) は、名前によって隠ぺいすることも、名前と署名によって隠ぺいすることもできます。

入れ子にされた型

いいえ

いいえ

プロパティ

該当なし

共通型システムの規則では、継承は、プロパティを実装するメソッドの継承と同じになります。リフレクションは、プロパティを名前と署名によって隠ぺいされているとして扱います。下記のメモ 2 を参照してください。

メモ:

  1. 名前と署名による隠ぺいでは、カスタム修飾子、戻り値の型、パラメーターの型、sentinel、およびアンマネージ呼び出し規約を含めて、署名のすべての部分が判断の対象となります。これはバイナリ比較です。

  2. リフレクションの場合、プロパティおよびイベントは名前と署名によって隠ぺいされています。基本クラスに get アクセサーと set アクセサーの両方を持つプロパティがあり、派生クラスには get アクセサーしかない場合、派生クラスのプロパティにより基本クラスのプロパティが隠ぺいされ、基本クラスの set アクセサーにはアクセスできません。

  3. カスタム属性は、共通型システムの一部ではありません。

types 配列と modifiers 配列の長さが同じです。types 配列で指定するパラメーターには、modifiers 配列で指定されている以下の各属性を設定できます。pdIn、pdOut、pdLcid、pdRetval、pdOptional、および pdHasDefault。これらの属性は、それぞれ [In]、[Out]、[lcid]、[retval]、[optional]、およびパラメーターが既定値を持つかどうかを指定する値を表します。パラメーターに関連付けられた属性はメタデータに格納され、相互運用性を拡張します。

次の BindingFlags フィルター フラグは、検索対象に含めるメソッドを定義するために使用できます。

  • 戻り値を取得するには、BindingFlags.Instance または BindingFlags.Static のいずれかを指定する必要があります。

  • 検索対象にパブリック メソッドを含めるための BindingFlags.Public を指定します。

  • 検索対象にパブリックではないメソッド (つまり、プライベート メソッドやプロテクト メソッド) を含めるための BindingFlags.NonPublic を指定します。

  • 階層構造の上位にある public 静的メンバーおよび protected 静的メンバーを検索対象に含めるには、BindingFlags.FlattenHierarchy を指定します。継承クラスの private 静的メンバーは含まれません。

次の BindingFlags 修飾フラグは、検索方法を変更するために使用できます。

  • name の大文字と小文字の違いを無視する場合は BindingFlags.IgnoreCase

  • 単に継承されただけのメソッドではなく、Type で宣言されたメソッドだけを検索する場合は BindingFlags.DeclaredOnly

詳細については、「System.Reflection.BindingFlags」を参照してください。

メモメモ:

コンストラクターおよびメソッドを検索する場合、パラメーターは省略できません。パラメーターは呼び出すときだけ省略できます。

現在の T:System.Type が構築ジェネリック型を表している場合、このメソッドは、型パラメーターを適切な型の引数で置き換えて MethodInfo を返します。

現在の Type がジェネリック型またはジェネリック メソッドの定義の型パラメーターを表している場合、このメソッドはクラス制約のメソッドを検索します。クラス制約がない場合は、Object のメソッドを検索します。

メモメモ:

ジェネリック メソッドの場合は、型引数を name に含めないでください。たとえば、C# コード GetMember("MyMethod<int>") は、型 int の汎用引数を 1 つ持っている MyMethod という名前のメソッドではなく、テキスト名 "MyMethod<int>" というメンバーを検索します。

バインディング制約、呼び出し規約、およびさまざまな引数型を指定し、MethodA の特定のオーバーロードを検索するコード例を次に示します。

メモメモ:

この例を実行するには、「Windows Phone での静的 TextBlock コントロールのあるコード例のビルド」を参照してください。



using System;
using System.Reflection;

class Example
{
   // Methods to get:

   public void MethodA(int i, int j) { }

   public void MethodA(int[] i) { }

   public void MethodA(ref int r) { }

   // Method that takes an out parameter:
   public void MethodA(int i, out int o) { o = 100; }


   public static void Demo(System.Windows.Controls.TextBlock outputBlock)
   {
      MethodInfo mInfo;

      // Get MethodA(int i, int j)
      mInfo = typeof(Example).GetMethod("MethodA",
          BindingFlags.Public | BindingFlags.Instance,
          null,
          CallingConventions.Any,
          new Type[] { typeof(int), typeof(int) },
          null);
      outputBlock.Text += String.Format("Found method: {0}", mInfo) + "\n";

      // Get MethodA(int[] i)
      mInfo = typeof(Example).GetMethod("MethodA",
          BindingFlags.Public | BindingFlags.Instance,
          null,
          CallingConventions.Any,
          new Type[] { typeof(int[]) },
          null);
      outputBlock.Text += String.Format("Found method: {0}", mInfo) + "\n";

      // Get MethodA(ref int r)
      mInfo = typeof(Example).GetMethod("MethodA",
          BindingFlags.Public | BindingFlags.Instance,
          null,
          CallingConventions.Any,
          new Type[] { typeof(int).MakeByRefType() },
          null);
      outputBlock.Text += String.Format("Found method: {0}", mInfo) + "\n";

      // Get MethodA(int i, out int o)
      mInfo = typeof(Example).GetMethod("MethodA",
          BindingFlags.Public | BindingFlags.Instance,
          null,
          CallingConventions.Any,
          new Type[] { typeof(int), typeof(int).MakeByRefType() },
          null);
      outputBlock.Text += String.Format("Found method: {0}", mInfo) + "\n";

   }
}

/* This method produces the following output:

Found method: Void MethodA(Int32, Int32)
Found method: Void MethodA(Int32[])
Found method: Void MethodA(Int32 ByRef)
Found method: Void MethodA(Int32, Int32 ByRef)
  */


Windows Phone OS

サポート: 8.0, 7.1, 7.0

表示: