ParameterBuilder Classe
Définition
Important
Certaines informations portent sur la préversion du produit qui est susceptible d’être en grande partie modifiée avant sa publication. Microsoft exclut toute garantie, expresse ou implicite, concernant les informations fournies ici.
Crée ou associe des informations de paramètre.
public ref class ParameterBuilder : System::Runtime::InteropServices::_ParameterBuilder
public ref class ParameterBuilder
[System.Runtime.InteropServices.ClassInterface(System.Runtime.InteropServices.ClassInterfaceType.None)]
public class ParameterBuilder : System.Runtime.InteropServices._ParameterBuilder
[System.Runtime.InteropServices.ClassInterface(System.Runtime.InteropServices.ClassInterfaceType.None)]
[System.Runtime.InteropServices.ComVisible(true)]
public class ParameterBuilder : System.Runtime.InteropServices._ParameterBuilder
public class ParameterBuilder
[<System.Runtime.InteropServices.ClassInterface(System.Runtime.InteropServices.ClassInterfaceType.None)>]
type ParameterBuilder = class
interface _ParameterBuilder
[<System.Runtime.InteropServices.ClassInterface(System.Runtime.InteropServices.ClassInterfaceType.None)>]
[<System.Runtime.InteropServices.ComVisible(true)>]
type ParameterBuilder = class
interface _ParameterBuilder
type ParameterBuilder = class
Public Class ParameterBuilder
Implements _ParameterBuilder
Public Class ParameterBuilder
- Héritage
-
ParameterBuilder
- Attributs
- Implémente
Exemples
L’exemple suivant montre comment créer une méthode dynamique avec un paramètre passé par référence à l’aide ParameterBuilderde .
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);
}
}
Imports System.Threading
Imports System.Reflection
Imports System.Reflection.Emit
_
Class ParamBuilderDemo
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 Main()
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()
Console.WriteLine("---")
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
Console.WriteLine("The pool is currently ${0}", thePool)
Console.WriteLine("The original balance of the account instance is ${0}", initialBalance)
Dim amountFromPool As Double = 50.0
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("---")
Dim passMe() As Object = {thePool, amountFromPool}
Console.WriteLine("The new balance in the account instance is ${0}", _
custType.InvokeMember("AddFundsFromPool", _
BindingFlags.InvokeMethod, Nothing, custObj, passMe))
thePool = CDbl(passMe(0))
Console.WriteLine("The new amount in the pool is ${0}", thePool)
End Sub
End Class
Remarques
Les attributs de paramètre doivent être cohérents avec la signature de méthode. Si vous spécifiez Out des attributs pour un paramètre, vous devez vous assurer que le type de ce paramètre de méthode est un ByRef type.
Certains attributs ParameterBuilder nécessitent que vous appeliez DefineMethod avec des paramètres viables afin que le langage intermédiaire Microsoft (MSIL) fonctionne correctement au moment de l’exécution. Par exemple, si vous définissez un ParameterBuilder paramètre avec ParameterAttributes.Out pour le paramètre 1 d’un MethodBuilder, le paramètre 1 doit MethodBuilder être une référence telle que Type.GetType(« System.String& »), plutôt que Type.GetType(« System.String »).
Propriétés
| Nom | Description |
|---|---|
| Attributes |
Récupère les attributs de ce paramètre. |
| IsIn |
Récupère si c’est un paramètre d’entrée. |
| IsOptional |
Récupère si ce paramètre est facultatif. |
| IsOut |
Récupère si ce paramètre est un paramètre de sortie. |
| Name |
Récupère le nom de ce paramètre. |
| Position |
Récupère la position de signature de ce paramètre. |
Méthodes
| Nom | Description |
|---|---|
| Equals(Object) |
Détermine si l’objet spécifié est égal à l’objet actuel. (Hérité de Object) |
| GetHashCode() |
Sert de fonction de hachage par défaut. (Hérité de Object) |
| GetToken() |
Récupère le jeton de ce paramètre. |
| GetType() |
Obtient la Type de l’instance actuelle. (Hérité de Object) |
| MemberwiseClone() |
Crée une copie superficielle du Objectactuel. (Hérité de Object) |
| SetConstant(Object) |
Définit la valeur par défaut du paramètre. |
| SetCustomAttribute(ConstructorInfo, Byte[]) |
Définissez un attribut personnalisé à l’aide d’un objet blob d’attributs personnalisé spécifié. |
| SetCustomAttribute(CustomAttributeBuilder) |
Définissez un attribut personnalisé à l’aide d’un générateur d’attributs personnalisé. |
| SetMarshal(UnmanagedMarshal) |
Obsolète.
Spécifie le marshaling pour ce paramètre. |
| ToString() |
Retourne une chaîne qui représente l’objet actuel. (Hérité de Object) |
Implémentations d’interfaces explicites
| Nom | Description |
|---|---|
| _ParameterBuilder.GetIDsOfNames(Guid, IntPtr, UInt32, UInt32, IntPtr) |
Mappe un jeu de noms avec un jeu correspondant d'identificateurs de dispatch. |
| _ParameterBuilder.GetTypeInfo(UInt32, UInt32, IntPtr) |
Récupère les informations de type pour un objet, qui peuvent être utilisées ensuite pour obtenir les informations de type d'une interface. |
| _ParameterBuilder.GetTypeInfoCount(UInt32) |
Récupère le nombre d'interfaces d'informations de type fourni par un objet (0 ou 1). |
| _ParameterBuilder.Invoke(UInt32, Guid, UInt32, Int16, IntPtr, IntPtr, IntPtr, IntPtr) |
Fournit l’accès aux propriétés et méthodes exposées par un objet. |