Export (0) Print
Expand All

ParameterBuilder Class

Creates or associates parameter information.

System.Object
  System.Reflection.Emit.ParameterBuilder

Namespace:  System.Reflection.Emit
Assembly:  mscorlib (in mscorlib.dll)

[ClassInterfaceAttribute(ClassInterfaceType.None)]
[ComVisibleAttribute(true)]
public class ParameterBuilder : _ParameterBuilder

The ParameterBuilder type exposes the following members.

  NameDescription
Public propertyAttributesRetrieves the attributes for this parameter.
Public propertyIsInRetrieves whether this is an input parameter.
Public propertyIsOptionalRetrieves whether this parameter is optional.
Public propertyIsOutRetrieves whether this parameter is an output parameter.
Public propertyNameRetrieves the name of this parameter.
Public propertyPositionRetrieves the signature position for this parameter.
Top

  NameDescription
Public methodEquals(Object)Determines whether the specified object is equal to the current object. (Inherited from Object.)
Protected methodFinalizeAllows an object to try to free resources and perform other cleanup operations before it is reclaimed by garbage collection. (Inherited from Object.)
Public methodGetHashCodeServes as the default hash function. (Inherited from Object.)
Public methodGetTokenRetrieves the token for this parameter.
Public methodGetTypeGets the Type of the current instance. (Inherited from Object.)
Protected methodMemberwiseCloneCreates a shallow copy of the current Object. (Inherited from Object.)
Public methodSetConstantSets the default value of the parameter.
Public methodSetCustomAttribute(CustomAttributeBuilder)Set a custom attribute using a custom attribute builder.
Public methodSetCustomAttribute(ConstructorInfo, Byte[])Set a custom attribute using a specified custom attribute blob.
Public methodSetMarshal Obsolete. Specifies the marshaling for this parameter.
Public methodToStringReturns a string that represents the current object. (Inherited from Object.)
Top

  NameDescription
Explicit interface implemetationPrivate method_ParameterBuilder.GetIDsOfNamesMaps a set of names to a corresponding set of dispatch identifiers.
Explicit interface implemetationPrivate method_ParameterBuilder.GetTypeInfoRetrieves the type information for an object, which can then be used to get the type information for an interface.
Explicit interface implemetationPrivate method_ParameterBuilder.GetTypeInfoCountRetrieves the number of type information interfaces that an object provides (either 0 or 1).
Explicit interface implemetationPrivate method_ParameterBuilder.InvokeProvides access to properties and methods exposed by an object.
Top

Parameter attributes need to consistent with the method signature. If you specify Out attributes for a parameter, you should ensure that the type of that method parameter is a ByRef type.

Some ParameterBuilder attributes require that you call DefineMethod with viable parameters in order for the Microsoft intermediate language (MSIL) to work correctly at runtime. For example, if you define a ParameterBuilder with ParameterAttributes.Out for parameter 1 of a MethodBuilder, then parameter 1 of MethodBuilder must be a reference such as Type.GetType("System.String&"), rather than Type.GetType("System.String").

The following example demonstrates how to create a dynamic method with a parameter passed by reference using ParameterBuilder.


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

class ParamBuilderDemo 

{

   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 Main()
   {
 	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();

	Console.WriteLine("---");

	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;
	Console.WriteLine("The pool is currently ${0}", thePool);
	Console.WriteLine("The original balance of the account instance is ${0}",
							initialBalance);

	double amountFromPool = 50.00;
	Console.WriteLine("The amount to be subtracted from the pool and added " +
			  "to the account is ${0}", amountFromPool);
	
	Console.WriteLine("---");
	Console.WriteLine("Calling {0} ...", myMemberInfo[0].ToString());
	Console.WriteLine("---");

	object[] passMe = new object[] { thePool, amountFromPool };
	Console.WriteLine("The new balance in the account instance is ${0}",
					custType.InvokeMember("AddFundsFromPool",
					BindingFlags.InvokeMethod,
					null, custObj, passMe));
	thePool = (double)passMe[0];
	Console.WriteLine("The new amount in the pool is ${0}", thePool);

   }

}

.NET Framework

Supported in: 4.6, 4.5, 4, 3.5, 3.0, 2.0, 1.1, 1.0

.NET Framework Client Profile

Supported in: 4, 3.5 SP1

Supported in: Windows Phone 8.1

Supported in: Windows Phone Silverlight 8.1

Supported in: Windows Phone Silverlight 8

Windows Phone 8.1, Windows Phone 8, Windows 8.1, Windows Server 2012 R2, Windows 8, Windows Server 2012, Windows 7, Windows Vista SP2, Windows Server 2008 (Server Core Role not supported), Windows Server 2008 R2 (Server Core Role supported with SP1 or later; Itanium not supported)

The .NET Framework does not support all versions of every platform. For a list of the supported versions, see .NET Framework System Requirements.

Any public static (Shared in Visual Basic) members of this type are thread safe. Any instance members are not guaranteed to be thread safe.
Show:
© 2014 Microsoft