ParameterBuilder Class

July 28, 2014

Creates or associates parameter information.

System.Object
  System.Reflection.Emit.ParameterBuilder

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

'Declaration
Public Class ParameterBuilder

The ParameterBuilder type exposes the following members.

  NameDescription
Public propertyAttributesGets the attributes for this parameter.
Public propertyIsInGets a value that indicates whether this is an input parameter.
Public propertyIsOptionalGets a value that indicates whether this parameter is optional.
Public propertyIsOutGets a value that indicates whether this parameter is an output parameter.
Public propertyNameGets the name of this parameter.
Public propertyPositionGets 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 the Object is reclaimed by garbage collection. (Inherited from Object.)
Public methodGetHashCodeServes as a hash function for a particular type. (Inherited from Object.)
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 methodToStringReturns a string that represents the current object. (Inherited from 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 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.



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



Windows Phone OS

Supported in: 8.1, 8.0, 7.1

Windows Phone

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