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

DynamicMethod コンストラクター (String, Type, Type[])

2013/12/12

メソッド名、戻り値の型、およびパラメーターの型を指定して、匿名でホストされる動的メソッドを作成します。

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

public DynamicMethod(
	string name,
	Type returnType,
	Type[] parameterTypes
)

パラメーター

name
型: System.String
動的メソッドの名前。長さ 0 の文字列にすることはできますが、null にすることはできません。
returnType
型: System.Type
動的メソッドの戻り値の型を指定する Type オブジェクト。メソッドに戻り値の型がない場合は null
parameterTypes
型: System.Type []
動的メソッドのパラメーターの型を指定する Type オブジェクトの配列。メソッドにパラメーターがない場合は null

例外条件
ArgumentException

parameterTypes の要素が null または Void です。

ArgumentNullException

namenull です。

NotSupportedException

returnTypeType.IsByReftrue を返す型です。

コンストラクターで作成される動的メソッドは、既存の型またはモジュールではなく、匿名のアセンブリに関連付けられます。Windows Phone アプリケーションでは、動的メソッドを既存の型やモジュールに関連付けることはできません。匿名のアセンブリは、動的メソッドにサンドボックス環境を提供するため、つまり、動的メソッドを他のコードから分離するためだけに存在します。

動的メソッドの MSIL (Microsoft Intermediate Language) に対して JIT (Just-In-Time) の参照範囲チェックが強制的に実行されます。つまり、動的メソッドのコードから、パブリック クラスのパブリック メソッドにアクセスできます。そのメソッドが privateprotected、または internal (Visual Basic では Friend) の型またはメンバーにアクセスしようとすると、例外がスローされます。

このコンストラクターは、メソッド属性に MethodAttributes.PublicMethodAttributes.Static、呼び出し規約に CallingConventions.Standard を指定します。

このコンストラクターを使用して、単純な動的メソッドを出力、実行するコード例を次に示します。このメソッドには、2 つのパラメーター (書式文字列と整数) があります。この 2 つの引数を使って String.Format(String, Object) メソッド オーバーロードを呼び出し、結果を返します。

メモメモ:

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


using System.Reflection.Emit;
using System.Reflection;
using System;

public class Example
{
   // Declare a delegate that can be used to execute the dynamic method.
   private delegate string Caller(string msg, int number);

   public static void Demo(System.Windows.Controls.TextBlock outputBlock)
   {
      // Create an array that specifies the types of the parameters
      // of the dynamic method. This method has a String parameter
      // and an Integer parameter.
      Type[] paramTypes = { typeof(string), typeof(int) };

      // Create an unnamed dynamic method with a return type of
      // Integer and with two parameters whose types are specified by
      // the array paramTypes. The dynamic method is anonymously
      // hosted. 
      DynamicMethod method = new DynamicMethod("", typeof(string), paramTypes);

      // Get a MethodInfo for the overload of String.Format that
      // takes a format string and an object for insertion in the format 
      // string. The dynamic method uses this overload to format the 
      // return string.
      MethodInfo stringFormat = typeof(string).GetMethod("Format", 
         new Type[] { typeof(string), typeof(object) });

      // Get an ILGenerator and emit a body for the dynamic method.
      ILGenerator il = method.GetILGenerator();

      // Load the arguments onto the execution stack. The second 
      // argument is an Integer, so it must be boxed before it can be 
      // passed to a parameter of type Object. 
      il.Emit(OpCodes.Ldarg_0);
      il.Emit(OpCodes.Ldarg_1);
      il.Emit(OpCodes.Box, typeof(int));

      // Call the String.Format method. The return value from that call 
      // is placed on the execution stack, so the dynamic method simply 
      // returns.         
      il.Emit(OpCodes.Call, stringFormat);
      il.Emit(OpCodes.Ret);

      // Create a delegate that represents the dynamic method. This
      // action completes the dynamic method, and any further attempts
      // to change the method have no effect.
      Caller callMethod = (Caller) method.CreateDelegate(typeof(Caller));

      // Invoke the delegate and display the result.
      string ret = callMethod("The second argument is: {0}.", 1969);

      outputBlock.Text += 
         String.Format("Invoking the delegate returned the string '{0}'.", ret);
   }
}

/* This code example produces the following output:

Invoking the delegate returned the string 'The second argument is: 1969.'.
 */


Windows Phone OS

サポート: 8.0, 7.1

表示: