TypeBuilder.GetField Metodo
Definizione
Importante
Alcune informazioni sono relative alla release non definitiva del prodotto, che potrebbe subire modifiche significative prima della release definitiva. Microsoft non riconosce alcuna garanzia, espressa o implicita, in merito alle informazioni qui fornite.
Restituisce un campo definito dall'oggetto TypeBuilder corrente.
Overload
GetField(Type, FieldInfo) |
Restituisce il campo del tipo generico specificato che corrisponde al campo specificato della definizione di tipo generico. |
GetField(String, BindingFlags) |
Restituisce il campo specificato con il nome specificato. |
GetField(Type, FieldInfo)
- Origine:
- TypeBuilder.cs
- Origine:
- RuntimeTypeBuilder.cs
- Origine:
- TypeBuilder.cs
Restituisce il campo del tipo generico specificato che corrisponde al campo specificato della definizione di tipo generico.
public:
static System::Reflection::FieldInfo ^ GetField(Type ^ type, System::Reflection::FieldInfo ^ field);
public static System.Reflection.FieldInfo GetField (Type type, System.Reflection.FieldInfo field);
static member GetField : Type * System.Reflection.FieldInfo -> System.Reflection.FieldInfo
Public Shared Function GetField (type As Type, field As FieldInfo) As FieldInfo
Parametri
- type
- Type
Il tipo generico creato di cui viene restituito il campo.
- field
- FieldInfo
Campo sulla definizione di tipo generico dell'oggetto type
, che specifica il campo di type
da restituire.
Restituisce
Oggetto FieldInfo che rappresenta il campo di type
corrispondente a field
, che specifica un campo appartenente alla definizione di tipo generico di type
.
Eccezioni
type
non rappresenta un tipo generico.
-oppure-
type
non è di tipo TypeBuilder.
-oppure-
Il tipo dichiarante di field
non è una definizione di tipo generico.
-oppure-
Il tipo dichiarante di field
non è la definizione di tipo generico di type
.
Esempio
L'esempio di codice seguente contiene il codice sorgente per una classe generica denominata Sample con un parametro di tipo denominato T
. La classe ha un campo denominato Field
, di tipo T
e un metodo generico denominato con il proprio parametro di tipo, denominato GM
U
. Il metodo GM
crea un'istanza di Sample
, sostituendo il proprio parametro di tipo per il parametro di tipo U
di Sample
e archivia il relativo parametro di input in Field
. Questo codice sorgente viene compilato ma non usato; è possibile visualizzarlo con il Ildasm.exe (IL Disassembler) e confrontarlo con il codice generato dalla classe Example
.
Il codice nella classe Example
illustra l'uso del GetField metodo per generare codice generico. Il Main
metodo della classe Example
crea un assembly dinamico contenente una classe denominata e usa il DefineGenericParameters metodo per renderlo generico aggiungendo un parametro di tipo denominato Sample
T
. Un costruttore senza parametri e un campo denominato Field
, di tipo T
, vengono aggiunti alla classe Sample
. Un metodo viene aggiunto e trasformato in un metodo GM
generico usando il MethodBuilder.DefineGenericParameters metodo . Il parametro di tipo di GM
è denominato U
. Dopo aver definito il parametro di tipo, la firma di GM
viene aggiunta usando il MethodBuilder.SetSignature metodo . Non esiste alcun tipo restituito e non sono necessari modificatori personalizzati, pertanto tutti i parametri di questo metodo sono null
tranne parameterTypes
; parameterTypes
imposta il tipo dell'unico parametro del metodo su U
, il parametro di tipo generico del metodo. Il corpo del metodo crea un'istanza del tipo Sample<U>
costruito (Sample(Of U)
in Visual Basic), assegna il parametro del metodo a Field
e quindi stampa il valore di Field
. Il GetField metodo viene usato per creare un FieldInfo oggetto che rappresenta il campo del tipo Sample<U>
generico costruito nelle OpCodes.Stfld istruzioni e OpCodes.Ldfld .
Un tipo fittizio è definito per contenere il metodo Main
entry-point . Nel corpo di Main
, il metodo statico GM
viene richiamato sul tipo Sample<int>
generico costruito (Sample(Of Integer)
in Visual Basic), con tipo String sostituito per U
.
Quando viene eseguito l'esempio di codice, salva l'assembly generato come TypeBuilderGetFieldExample.exe. È possibile eseguire TypeBuilderGetFieldExample.exe ed è possibile usare il Ildasm.exe (IL Disassembler) per confrontare il codice generato con il codice per la Sample
classe compilata nell'esempio di codice stesso.
using System;
using System.Reflection;
using System.Reflection.Emit;
// Compare the MSIL in this class to the MSIL
// generated by the Reflection.Emit code in class
// Example.
public class Sample<T>
{
public T Field;
public static void GM<U>(U val)
{
Sample<U> s = new Sample<U>();
s.Field = val;
Console.WriteLine(s.Field);
}
}
public class Example
{
public static void Main()
{
AppDomain myDomain = AppDomain.CurrentDomain;
AssemblyName myAsmName =
new AssemblyName("TypeBuilderGetFieldExample");
AssemblyBuilder myAssembly = myDomain.DefineDynamicAssembly(
myAsmName, AssemblyBuilderAccess.Save);
ModuleBuilder myModule = myAssembly.DefineDynamicModule(
myAsmName.Name,
myAsmName.Name + ".exe");
// Define the sample type.
TypeBuilder myType = myModule.DefineType("Sample",
TypeAttributes.Class | TypeAttributes.Public);
// Add a type parameter, making the type generic.
string[] typeParamNames = {"T"};
GenericTypeParameterBuilder[] typeParams =
myType.DefineGenericParameters(typeParamNames);
// Define a default constructor. Normally it would
// not be necessary to define the default constructor,
// but in this case it is needed for the call to
// TypeBuilder.GetConstructor, which gets the default
// constructor for the generic type constructed from
// Sample<T>, in the generic method GM<U>.
ConstructorBuilder ctor = myType.DefineDefaultConstructor(
MethodAttributes.PrivateScope | MethodAttributes.Public |
MethodAttributes.HideBySig | MethodAttributes.SpecialName |
MethodAttributes.RTSpecialName);
// Add a field of type T, with the name Field.
FieldBuilder myField = myType.DefineField("Field",
typeParams[0],
FieldAttributes.Public);
// Add a method and make it generic, with a type
// parameter named U. Note how similar this is to
// the way Sample is turned into a generic type. The
// method has no signature, because the type of its
// only parameter is U, which is not yet defined.
MethodBuilder genMethod = myType.DefineMethod("GM",
MethodAttributes.Public | MethodAttributes.Static);
string[] methodParamNames = {"U"};
GenericTypeParameterBuilder[] methodParams =
genMethod.DefineGenericParameters(methodParamNames);
// Now add a signature for genMethod, specifying U
// as the type of the parameter. There is no return value
// and no custom modifiers.
genMethod.SetSignature(null, null, null,
new Type[] { methodParams[0] }, null, null);
// Emit a method body for the generic method.
ILGenerator ilg = genMethod.GetILGenerator();
// Construct the type Sample<U> using MakeGenericType.
Type SampleOfU = myType.MakeGenericType( methodParams[0] );
// Create a local variable to store the instance of
// Sample<U>.
ilg.DeclareLocal(SampleOfU);
// Call the default constructor. Note that it is
// necessary to have the default constructor for the
// constructed generic type Sample<U>; use the
// TypeBuilder.GetConstructor method to obtain this
// constructor.
ConstructorInfo ctorOfU = TypeBuilder.GetConstructor(
SampleOfU, ctor);
ilg.Emit(OpCodes.Newobj, ctorOfU);
// Store the instance in the local variable; load it
// again, and load the parameter of genMethod.
ilg.Emit(OpCodes.Stloc_0);
ilg.Emit(OpCodes.Ldloc_0);
ilg.Emit(OpCodes.Ldarg_0);
// In order to store the value in the field of the
// instance of Sample<U>, it is necessary to have
// a FieldInfo representing the field of the
// constructed type. Use TypeBuilder.GetField to
// obtain this FieldInfo.
FieldInfo FieldOfU = TypeBuilder.GetField(
SampleOfU, myField);
// Store the value in the field.
ilg.Emit(OpCodes.Stfld, FieldOfU);
// Load the instance, load the field value, box it
// (specifying the type of the type parameter, U), and
// print it.
ilg.Emit(OpCodes.Ldloc_0);
ilg.Emit(OpCodes.Ldfld, FieldOfU);
ilg.Emit(OpCodes.Box, methodParams[0]);
MethodInfo writeLineObj =
typeof(Console).GetMethod("WriteLine",
new Type[] { typeof(object) });
ilg.EmitCall(OpCodes.Call, writeLineObj, null);
ilg.Emit(OpCodes.Ret);
// Emit an entry point method; this must be in a
// non-generic type.
TypeBuilder dummy = myModule.DefineType("Dummy",
TypeAttributes.Class | TypeAttributes.NotPublic);
MethodBuilder entryPoint = dummy.DefineMethod("Main",
MethodAttributes.Public | MethodAttributes.Static,
null, null);
ilg = entryPoint.GetILGenerator();
// In order to call the static generic method GM, it is
// necessary to create a constructed type from the
// generic type definition for Sample. This can be any
// constructed type; in this case Sample<int> is used.
Type SampleOfInt =
myType.MakeGenericType( typeof(int) );
// Next get a MethodInfo representing the static generic
// method GM on type Sample<int>.
MethodInfo SampleOfIntGM = TypeBuilder.GetMethod(SampleOfInt,
genMethod);
// Next get a MethodInfo for GM<string>, which is the
// instantiation of GM that Main calls.
MethodInfo GMOfString =
SampleOfIntGM.MakeGenericMethod( typeof(string) );
// Finally, emit the call. Push a string onto
// the stack, as the argument for the generic method.
ilg.Emit(OpCodes.Ldstr, "Hello, world!");
ilg.EmitCall(OpCodes.Call, GMOfString, null);
ilg.Emit(OpCodes.Ret);
myType.CreateType();
dummy.CreateType();
myAssembly.SetEntryPoint(entryPoint);
myAssembly.Save(myAsmName.Name + ".exe");
Console.WriteLine(myAsmName.Name + ".exe has been saved.");
}
}
Imports System.Reflection
Imports System.Reflection.Emit
' Compare the MSIL in this class to the MSIL
' generated by the Reflection.Emit code in class
' Example.
Public Class Sample(Of T)
Public Field As T
Public Shared Sub GM(Of U)(ByVal val As U)
Dim s As New Sample(Of U)
s.Field = val
Console.WriteLine(s.Field)
End Sub
End Class
Public Class Example
Public Shared Sub Main()
Dim myDomain As AppDomain = AppDomain.CurrentDomain
Dim myAsmName As New AssemblyName("TypeBuilderGetFieldExample")
Dim myAssembly As AssemblyBuilder = _
myDomain.DefineDynamicAssembly(myAsmName, _
AssemblyBuilderAccess.Save)
Dim myModule As ModuleBuilder = _
myAssembly.DefineDynamicModule(myAsmName.Name, _
myAsmName.Name & ".exe")
' Define the sample type.
Dim myType As TypeBuilder = myModule.DefineType( _
"Sample", _
TypeAttributes.Class Or TypeAttributes.Public)
' Add a type parameter, making the type generic.
Dim typeParamNames() As String = { "T" }
Dim typeParams As GenericTypeParameterBuilder() = _
myType.DefineGenericParameters(typeParamNames)
' Define a default constructor. Normally it would
' not be necessary to define the default constructor,
' but in this case it is needed for the call to
' TypeBuilder.GetConstructor, which gets the default
' constructor for the generic type constructed from
' Sample(Of T), in the generic method GM(Of U).
Dim ctor As ConstructorBuilder = _
myType.DefineDefaultConstructor( _
MethodAttributes.PrivateScope Or MethodAttributes.Public _
Or MethodAttributes.HideBySig Or MethodAttributes.SpecialName _
Or MethodAttributes.RTSpecialName)
' Add a field of type T, with the name Field.
Dim myField As FieldBuilder = myType.DefineField( _
"Field", typeParams(0), FieldAttributes.Public)
' Add a method and make it generic, with a type
' parameter named U. Note how similar this is to
' the way Sample is turned into a generic type. The
' method has no signature, because the type of its
' only parameter is U, which is not yet defined.
Dim genMethod As MethodBuilder = _
myType.DefineMethod("GM", _
MethodAttributes.Public Or MethodAttributes.Static)
Dim methodParamNames() As String = { "U" }
Dim methodParams As GenericTypeParameterBuilder() = _
genMethod.DefineGenericParameters(methodParamNames)
' Now add a signature for genMethod, specifying U
' as the type of the parameter. There is no return value
' and no custom modifiers.
genMethod.SetSignature(Nothing, Nothing, Nothing, _
New Type() { methodParams(0) }, Nothing, Nothing)
' Emit a method body for the generic method.
Dim ilg As ILGenerator = genMethod.GetILGenerator()
' Construct the type Sample(Of U) using MakeGenericType.
Dim SampleOfU As Type = _
myType.MakeGenericType(methodParams(0))
' Create a local variable to store the instance of
' Sample(Of U).
ilg.DeclareLocal(SampleOfU)
' Call the default constructor. Note that it is
' necessary to have the default constructor for the
' constructed generic type Sample(Of U); use the
' TypeBuilder.GetConstructor method to obtain this
' constructor.
Dim ctorOfU As ConstructorInfo = _
TypeBuilder.GetConstructor(SampleOfU, ctor)
ilg.Emit(OpCodes.Newobj, ctorOfU)
' Store the instance in the local variable; load it
' again, and load the parameter of genMethod.
ilg.Emit(OpCodes.Stloc_0)
ilg.Emit(OpCodes.Ldloc_0)
ilg.Emit(OpCodes.Ldarg_0)
' In order to store the value in the field of the
' instance of Sample(Of U), it is necessary to have
' a FieldInfo representing the field of the
' constructed type. Use TypeBuilder.GetField to
' obtain this FieldInfo.
Dim FieldOfU As FieldInfo = _
TypeBuilder.GetField(SampleOfU, myField)
' Store the value in the field.
ilg.Emit(OpCodes.Stfld, FieldOfU)
' Load the instance, load the field value, box it
' (specifying the type of the type parameter, U),
' and print it.
ilg.Emit(OpCodes.Ldloc_0)
ilg.Emit(OpCodes.Ldfld, FieldOfU)
ilg.Emit(OpCodes.Box, methodParams(0))
Dim writeLineObj As MethodInfo = _
GetType(Console).GetMethod("WriteLine", _
New Type() {GetType(Object)})
ilg.EmitCall(OpCodes.Call, writeLineObj, Nothing)
ilg.Emit(OpCodes.Ret)
' Emit an entry point method; this must be in a
' non-generic type.
Dim dummy As TypeBuilder = _
myModule.DefineType("Dummy", _
TypeAttributes.Class Or TypeAttributes.NotPublic)
Dim entryPoint As MethodBuilder = _
dummy.DefineMethod("Main", _
MethodAttributes.Public Or MethodAttributes.Static, _
Nothing, Nothing)
ilg = entryPoint.GetILGenerator()
' In order to call the static generic method GM, it is
' necessary to create a constructed type from the
' generic type definition for Sample. This can be ANY
' constructed type; in this case Sample(Of Integer)
' is used.
Dim SampleOfInt As Type = _
myType.MakeGenericType(GetType(Integer))
' Next get a MethodInfo representing the static generic
' method GM on type Sample(Of Integer).
Dim SampleOfIntGM As MethodInfo = _
TypeBuilder.GetMethod(SampleOfInt, genMethod)
' Next get a MethodInfo for GM(Of String), which is the
' instantiation of generic method GM that is called
' by Sub Main.
Dim GMOfString As MethodInfo = _
SampleOfIntGM.MakeGenericMethod(GetType(String))
' Finally, emit the call. Push a string onto
' the stack, as the argument for the generic method.
ilg.Emit(OpCodes.Ldstr, "Hello, world!")
ilg.EmitCall(OpCodes.Call, GMOfString, Nothing)
ilg.Emit(OpCodes.Ret)
myType.CreateType()
dummy.CreateType()
myAssembly.SetEntryPoint(entryPoint)
myAssembly.Save(myAsmName.Name & ".exe")
Console.WriteLine(myAsmName.Name & ".exe has been saved.")
End Sub
End Class
Commenti
Il GetField metodo consente di ottenere un oggetto che rappresenta un FieldInfo campo di un tipo generico costruito il cui valore generico è rappresentato da un TypeBuilder oggetto.
Si supponga, ad esempio, di avere un oggetto che rappresenta il tipo nella sintassi C# ( in Visual Basic, in C++) e un FieldBuilder oggetto che rappresenta un TypeBuilder campo public T F
nella sintassi C# (G(Of T)
Public F As T
in Visual Basic, generic <T> ref class G
public: T F
in C++) definito da G<T>
.G<T>
Si supponga che G<T>
abbia un metodo generico con parametro U
di tipo che crea un'istanza del tipo G<U>
costruito e chiama il campo F
in tale istanza. Per generare la chiamata alla funzione, è necessario un FieldInfo oggetto che rappresenta F
sul tipo costruito, ovvero di tipo anziché di tipo U
T
. A tale scopo, chiamare prima il MakeGenericType metodo nell'oggetto, specificando l'oggetto TypeBuilderGenericTypeParameterBuilder che rappresenta U
come argomento di tipo. Chiamare quindi il metodo con il GetField valore restituito del MakeGenericType metodo come parametro type
e l'oggetto FieldBuilder che rappresenta F
come parametro field
. Il valore restituito è l'oggetto FieldInfo che è necessario generare la chiamata alla funzione. L'esempio di codice illustra questo scenario.
Si applica a
GetField(String, BindingFlags)
- Origine:
- TypeBuilder.cs
Restituisce il campo specificato con il nome specificato.
public:
override System::Reflection::FieldInfo ^ GetField(System::String ^ name, System::Reflection::BindingFlags bindingAttr);
public override System.Reflection.FieldInfo? GetField (string name, System.Reflection.BindingFlags bindingAttr);
public override System.Reflection.FieldInfo GetField (string name, System.Reflection.BindingFlags bindingAttr);
override this.GetField : string * System.Reflection.BindingFlags -> System.Reflection.FieldInfo
Public Overrides Function GetField (name As String, bindingAttr As BindingFlags) As FieldInfo
Parametri
- name
- String
Nome del campo da ottenere.
- bindingAttr
- BindingFlags
Deve essere un flag di bit di BindingFlags, come in InvokeMethod
, NonPublic
e così via.
Restituisce
Restituisce l'oggetto FieldInfo che rappresenta il campo dichiarato o ereditato da questo tipo con il nome specificato e il modificatore pubblico o non pubblico. Se non sono presenti corrispondenze, verrà restituito null
.
Eccezioni
Questo metodo non viene implementato per i tipi incompleti.
Commenti
Recuperare il tipo usando Type.GetType o Assembly.GetType usare la reflection sul tipo recuperato.