ParameterBuilder Class
Microsoft Silverlight will reach end of support after October 2021. Learn more.
Creates or associates parameter information.
Inheritance Hierarchy
System.Object
System.Reflection.Emit.ParameterBuilder
Namespace: System.Reflection.Emit
Assembly: mscorlib (in mscorlib.dll)
Syntax
'Declaration
<ClassInterfaceAttribute(ClassInterfaceType.None)> _
<ComVisibleAttribute(True)> _
Public Class ParameterBuilder
[ClassInterfaceAttribute(ClassInterfaceType.None)]
[ComVisibleAttribute(true)]
public class ParameterBuilder
The ParameterBuilder type exposes the following members.
Properties
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. |
Top
Methods
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.) | |
GetToken | Gets the token for this parameter. | |
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, array<Byte[]) | Security Critical. Set a custom attribute using a specified custom attribute blob. | |
ToString | Returns a string that represents the current object. (Inherited from Object.) |
Top
Remarks
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").
Examples
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 Use a Demo Method and a TextBlock Control. |
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
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";
}
}
Version Information
Silverlight
Supported in: 5, 4, 3
Silverlight for Windows Phone
Supported in: Windows Phone OS 7.1
Platforms
For a list of the operating systems and browsers that are supported by Silverlight, see Supported Operating Systems and Browsers.
Thread Safety
Any public static (Shared in Visual Basic) members of this type are thread safe. Any instance members are not guaranteed to be thread safe.