ParameterBuilder Class
[ This article is for Windows Phone 8 developers. If you’re developing for Windows 10, see the latest documentation. ]
Creates or associates parameter information.
Assembly: mscorlib (in mscorlib.dll)
The ParameterBuilder type exposes the following members.
| Name | Description | |
|---|---|---|
![]() | Attributes | Gets the attributes for this parameter. |
![]() | IsIn | Gets a value that indicates whether this is an input parameter. |
![]() | IsOptional | Gets a value that indicates whether this parameter is optional. |
![]() | IsOut | Gets a value that indicates whether this parameter is an output parameter. |
![]() | Name | Gets the name of this parameter. |
![]() | Position | Gets the signature position for this parameter. |
| Name | Description | |
|---|---|---|
![]() | Equals(Object) | Determines whether the specified Object is equal to the current Object. (Inherited from Object.) |
![]() | Finalize | Allows an object to try to free resources and perform other cleanup operations before the Object is reclaimed by garbage collection. (Inherited from Object.) |
![]() | GetHashCode | Serves as a hash function for a particular type. (Inherited from Object.) |
![]() | GetType | Gets the Type of the current instance. (Inherited from Object.) |
![]() | MemberwiseClone | Creates a shallow copy of the current Object. (Inherited from Object.) |
![]() | SetConstant | Sets the default value of the parameter. |
![]() | SetCustomAttribute(CustomAttributeBuilder) | Set a custom attribute using a custom attribute builder. |
![]() | SetCustomAttribute(ConstructorInfo, Byte()) | Set a custom attribute using a specified custom attribute blob. |
![]() | ToString | Returns a string that represents the current object. (Inherited from Object.) |
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 provide 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 method, then parameter 1 of the method 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.
Note: |
|---|
To run this example, see Building examples that have static TextBlock controls for Windows Phone 8. |
Imports System.Threading Imports System.Reflection Imports System.Reflection.Emit _ Class Example Public Shared Function BuildCustomerDataType() As Type Dim myDomain As AppDomain = Thread.GetDomain() Dim myAsmName As New AssemblyName() myAsmName.Name = "MyDynamicAssembly" Dim myAsmBuilder As AssemblyBuilder = myDomain.DefineDynamicAssembly(myAsmName, _ AssemblyBuilderAccess.Run) Dim myModBuilder As ModuleBuilder = myAsmBuilder.DefineDynamicModule("MyMod") Dim myTypeBuilder As TypeBuilder = myModBuilder.DefineType("CustomerData", TypeAttributes.Public) Dim customerNameBldr As FieldBuilder = myTypeBuilder.DefineField("customerName", _ GetType(String), _ FieldAttributes.Private) Dim acctIDBldr As FieldBuilder = myTypeBuilder.DefineField("acctID", _ GetType(String), _ FieldAttributes.Private) Dim balanceAmtBldr As FieldBuilder = myTypeBuilder.DefineField("balanceAmt", _ GetType(Double), _ FieldAttributes.Private) Dim myCtorBuilder As ConstructorBuilder = myTypeBuilder.DefineConstructor(MethodAttributes.Public, _ CallingConventions.HasThis, _ New Type() {GetType(String), _ GetType(String), _ GetType(Double)}) Dim ctorIL As ILGenerator = myCtorBuilder.GetILGenerator() Dim objType As Type = Type.GetType("System.Object") Dim objCtor As ConstructorInfo = 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). Dim myMthdBuilder As MethodBuilder = myTypeBuilder.DefineMethod("AddFundsFromPool", _ MethodAttributes.Public, _ GetType(Double), _ New Type() {Type.GetType("System.Double&"), _ GetType(Double)}) Dim poolRefBuilder As ParameterBuilder = myMthdBuilder.DefineParameter(1, _ ParameterAttributes.Out, "fundsPool") Dim amountFromPoolBuilder As ParameterBuilder = myMthdBuilder.DefineParameter(2, _ ParameterAttributes.In, "amountFromPool") Dim mthdIL As ILGenerator = 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() End Function 'BuildCustomerDataType Public Shared Sub Demo(ByVal outputBlock As System.Windows.Controls.TextBlock) Dim custType As Type = Nothing Dim custObj As Object = Nothing Dim custArgTypes() As Type = {GetType(String), GetType(String), GetType(Double)} ' Call the method to build our dynamic class. custType = BuildCustomerDataType() outputBlock.Text &= "---" & vbCrLf Dim myCustCtor As ConstructorInfo = custType.GetConstructor(custArgTypes) Dim initialBalance As Double = 100.0 custObj = myCustCtor.Invoke(New Object() {"Joe Consumer", "5678-XYZ", initialBalance}) Dim myMemberInfo As MemberInfo() = custType.GetMember("AddFundsFromPool") Dim thePool As Double = 1000.0 outputBlock.Text &= String.Format("The pool is currently ${0}", thePool) & vbCrLf outputBlock.Text &= String.Format("The original balance of the account instance is ${0}", initialBalance) & vbCrLf Dim amountFromPool As Double = 50.0 outputBlock.Text &= String.Format("The amount to be subtracted from the pool and added " & _ "to the account is ${0}", amountFromPool) & vbCrLf outputBlock.Text &= "---" & vbCrLf outputBlock.Text &= String.Format("Calling {0} ...", myMemberInfo(0).ToString()) & vbCrLf outputBlock.Text &= "---" & vbCrLf Dim passMe() As Object = {thePool, amountFromPool} outputBlock.Text &= String.Format("The new balance in the account instance is ${0}", _ custType.InvokeMember("AddFundsFromPool", _ BindingFlags.InvokeMethod, Nothing, custObj, passMe)) & vbCrLf thePool = CDbl(passMe(0)) outputBlock.Text &= String.Format("The new amount in the pool is ${0}", thePool) & vbCrLf End Sub 'Main End Class 'ParamBuilderDemo



Note: