エクスポート (0) 印刷
すべて展開
情報
要求されたトピックは次のとおりです。しかし、このトピックはこのライブラリには含まれていません。

ParameterBuilder クラス

2013/12/12

パラメーター情報の作成または関連付けを行います。

System.Object
  System.Reflection.Emit.ParameterBuilder

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

public class ParameterBuilder

ParameterBuilder 型で公開されるメンバーは以下のとおりです。

  名前説明
パブリック プロパティAttributesこのパラメーターの属性を取得します。
パブリック プロパティIsInこれが入力パラメーターであるかどうかを示す値を取得します。
パブリック プロパティIsOptionalこのパラメーターが省略可能かどうかを示す値を取得します。
パブリック プロパティIsOutこのパラメーターが出力パラメーターであるかどうかを示す値を取得します。
パブリック プロパティNameこのパラメーターの名前を取得します。
パブリック プロパティPositionこのパラメーターのシグネチャ位置を取得します。
このページのトップへ

  名前説明
パブリック メソッドEquals(Object)指定した Object が、現在の Object と等しいかどうかを判断します。 (Object から継承されます。)
プロテクト メソッドFinalizeObject がガベージ コレクションで再利用される前に、Object がリソースを解放して他のクリーンアップ操作を実行できるようにします。 (Object から継承されます。)
パブリック メソッドGetHashCode特定の型のハッシュ関数として機能します。 (Object から継承されます。)
パブリック メソッドGetType現在のインスタンスの Type を取得します。 (Object から継承されます。)
プロテクト メソッドMemberwiseClone現在の Object の簡易コピーを作成します。 (Object から継承されます。)
パブリック メソッドSetConstantパラメーターの既定値を設定します。
パブリック メソッドSetCustomAttribute(CustomAttributeBuilder)カスタム属性ビルダーを使用して、カスタム属性を設定します。
パブリック メソッドSetCustomAttribute(ConstructorInfo, Byte[])指定されたカスタム属性 blob を使用して、カスタム属性を設定します。
パブリック メソッドToString現在のオブジェクトを表す文字列を返します。 (Object から継承されます。)
このページのトップへ

パラメーター属性は、メソッド シグネチャと矛盾しないようにする必要があります。パラメーターに Out 属性を指定する場合は、そのメソッド パラメーターの型を ByRef 型にする必要があります。

ParameterBuilder 属性を使用する場合、属性によっては、MSIL (Microsoft Intermediate Language) が実行時に正しく動作するように有効なパラメーターを指定する必要があります。たとえば、メソッドのパラメーター 1 に ParameterAttributes.Out を使用して ParameterBuilder を定義する場合、メソッドのパラメーター 1 は、Type.GetType("System.String") ではなく、Type.GetType("System.String&") のような参照にする必要があります。

ParameterBuilder を使用して参照を渡すパラメーターを持つ動的メソッドを作成する方法を次の例に示します。

メモメモ:

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



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

class Example
{

   public static Type BuildCustomerDataType()
   {

      AppDomain myDomain = Thread.GetDomain();
      AssemblyName myAsmName = new AssemblyName();
      myAsmName.Name = "MyDynamicAssembly";

      AssemblyBuilder myAsmBuilder = myDomain.DefineDynamicAssembly(myAsmName,
                     AssemblyBuilderAccess.Run);

      ModuleBuilder myModBuilder = myAsmBuilder.DefineDynamicModule("MyMod");

      TypeBuilder myTypeBuilder = myModBuilder.DefineType("CustomerData",
                     TypeAttributes.Public);

      FieldBuilder customerNameBldr = myTypeBuilder.DefineField("customerName",
                        typeof(string),
                        FieldAttributes.Private);
      FieldBuilder acctIDBldr = myTypeBuilder.DefineField("acctID",
                        typeof(string),
                        FieldAttributes.Private);
      FieldBuilder balanceAmtBldr = myTypeBuilder.DefineField("balanceAmt",
                        typeof(double),
                        FieldAttributes.Private);

      ConstructorBuilder myCtorBuilder = myTypeBuilder.DefineConstructor(
                        MethodAttributes.Public,
                        CallingConventions.HasThis,
                        new Type[] { typeof(string),
								     typeof(string),
								     typeof(double) });


      ILGenerator ctorIL = myCtorBuilder.GetILGenerator();

      Type objType = Type.GetType("System.Object");
      ConstructorInfo objCtor = objType.GetConstructor(new Type[] { });

      ctorIL.Emit(OpCodes.Ldarg_0);
      ctorIL.Emit(OpCodes.Call, objCtor);

      ctorIL.Emit(OpCodes.Ldarg_0);
      ctorIL.Emit(OpCodes.Ldarg_1);
      ctorIL.Emit(OpCodes.Stfld, customerNameBldr);

      ctorIL.Emit(OpCodes.Ldarg_0);
      ctorIL.Emit(OpCodes.Ldarg_2);
      ctorIL.Emit(OpCodes.Stfld, acctIDBldr);

      ctorIL.Emit(OpCodes.Ldarg_0);
      ctorIL.Emit(OpCodes.Ldarg_3);
      ctorIL.Emit(OpCodes.Stfld, balanceAmtBldr);

      ctorIL.Emit(OpCodes.Ret);

      // This method will take an amount from a static pool and add it to the balance.

      // Note that we are passing the first parameter, fundsPool, by reference. Therefore,
      // we need to inform the MethodBuilder to expect a ref, by declaring the first
      // parameter's type to be System.Double& (a reference to a double).

      MethodBuilder myMthdBuilder = myTypeBuilder.DefineMethod("AddFundsFromPool",
                     MethodAttributes.Public,
                     typeof(double),
                     new Type[] { Type.GetType("System.Double&"),
							     typeof(double) });

      ParameterBuilder poolRefBuilder = myMthdBuilder.DefineParameter(1,
                     ParameterAttributes.Out,
                     "fundsPool");

      ParameterBuilder amountFromPoolBuilder = myMthdBuilder.DefineParameter(2,
                     ParameterAttributes.In,
                          "amountFromPool");

      ILGenerator mthdIL = myMthdBuilder.GetILGenerator();

      mthdIL.Emit(OpCodes.Ldarg_1);
      mthdIL.Emit(OpCodes.Ldarg_1);
      mthdIL.Emit(OpCodes.Ldind_R8);
      mthdIL.Emit(OpCodes.Ldarg_2);
      mthdIL.Emit(OpCodes.Sub);

      mthdIL.Emit(OpCodes.Stind_R8);

      mthdIL.Emit(OpCodes.Ldarg_0);
      mthdIL.Emit(OpCodes.Ldarg_0);
      mthdIL.Emit(OpCodes.Ldfld, balanceAmtBldr);
      mthdIL.Emit(OpCodes.Ldarg_2);
      mthdIL.Emit(OpCodes.Add);

      mthdIL.Emit(OpCodes.Stfld, balanceAmtBldr);

      mthdIL.Emit(OpCodes.Ldarg_0);
      mthdIL.Emit(OpCodes.Ldfld, balanceAmtBldr);
      mthdIL.Emit(OpCodes.Ret);

      return myTypeBuilder.CreateType();

   }

   public static void Demo(System.Windows.Controls.TextBlock outputBlock)
   {
      Type custType = null;
      object custObj = null;

      Type[] custArgTypes = new Type[] { typeof(string), typeof(string), typeof(double) };

      // Call the method to build our dynamic class.

      custType = BuildCustomerDataType();

      outputBlock.Text += "---" + "\n";

      ConstructorInfo myCustCtor = custType.GetConstructor(custArgTypes);
      double initialBalance = 100.00;
      custObj = myCustCtor.Invoke(new object[] { "Joe Consumer", 
						   "5678-XYZ", 
					  	   initialBalance });

      MemberInfo[] myMemberInfo = custType.GetMember("AddFundsFromPool");


      double thePool = 1000.00;
      outputBlock.Text += String.Format("The pool is currently ${0}", thePool) + "\n";
      outputBlock.Text += String.Format("The original balance of the account instance is ${0}",
                        initialBalance) + "\n";

      double amountFromPool = 50.00;
      outputBlock.Text += String.Format("The amount to be subtracted from the pool and added " +
              "to the account is ${0}", amountFromPool) + "\n";

      outputBlock.Text += "---" + "\n";
      outputBlock.Text += String.Format("Calling {0} ...", myMemberInfo[0].ToString()) + "\n";
      outputBlock.Text += "---" + "\n";

      object[] passMe = new object[] { thePool, amountFromPool };
      outputBlock.Text += String.Format("The new balance in the account instance is ${0}",
                  custType.InvokeMember("AddFundsFromPool",
                  BindingFlags.InvokeMethod,
                  null, custObj, passMe)) + "\n";
      thePool = (double)passMe[0];
      outputBlock.Text += String.Format("The new amount in the pool is ${0}", thePool) + "\n";

   }

}



Windows Phone OS

サポート: 8.0, 7.1

この型のすべてのパブリック static (Visual Basic では Shared) メンバーは、スレッド セーフです。インスタンス メンバーの場合は、スレッド セーフであるとは限りません。

表示:
© 2014 Microsoft