TypeBuilder.GetField Methode

Definitie

Retourneert een veld dat is gedefinieerd door de huidige TypeBuilder.

Overloads

Name Description
GetField(Type, FieldInfo)

Retourneert het veld van het opgegeven samengestelde algemene type dat overeenkomt met het opgegeven veld van de algemene typedefinitie.

GetField(String, BindingFlags)

Retourneert het veld dat is opgegeven met de opgegeven naam.

GetField(Type, FieldInfo)

Bron:
TypeBuilder.cs
Bron:
TypeBuilder.cs
Bron:
TypeBuilder.cs
Bron:
RuntimeTypeBuilder.cs
Bron:
TypeBuilder.cs

Retourneert het veld van het opgegeven samengestelde algemene type dat overeenkomt met het opgegeven veld van de algemene typedefinitie.

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

Parameters

type
Type

Het samengestelde algemene type waarvan het veld wordt geretourneerd.

field
FieldInfo

Een veld in de algemene typedefinitie van type, waarmee wordt opgegeven welk veld moet type worden geretourneerd.

Retouren

Een FieldInfo object dat het veld vertegenwoordigt dat type overeenkomt met field, waarmee een veld wordt opgegeven dat hoort bij de algemene typedefinitie van type.

Uitzonderingen

type vertegenwoordigt geen algemeen type.

– of –

type is niet van het type TypeBuilder.

– of –

Het declaratietype field is geen algemene typedefinitie.

– of –

Het declaratietype field is niet de algemene typedefinitie van type.

Voorbeelden

Het volgende codevoorbeeld bevat broncode voor een algemene klasse met de naam Sample met een typeparameter met de naam T. De klasse heeft een veld met de naam Field, van het type Ten een algemene methode met GM een eigen typeparameter met de naam U. De methode GM maakt een exemplaar van Sample, waarbij een eigen typeparameter U wordt vervangen door de typeparameter van Sampleen de invoerparameter wordt opgeslagen in Field. Deze broncode wordt gecompileerd maar niet gebruikt; u kunt het bekijken met de Ildasm.exe (IL Disassembler) en deze vergelijken met de code die door klasse Examplewordt verzonden.

De code in klasse Example demonstreert het gebruik van de GetField methode om algemene code te verzenden. De Main methode van klasse Example maakt een dynamische assembly met een klasse genaamd Sampleen gebruikt de methode om deze DefineGenericParameters algemeen te maken door een typeparameter met de naam Ttoe te voegen. Een parameterloze constructor en een veld met de naam Field, van het type T, worden toegevoegd aan klasse Sample. Een methode GM wordt toegevoegd en omgezet in een algemene methode met behulp van de MethodBuilder.DefineGenericParameters methode. De parameter van GM het type heeft de naam U. Nadat de typeparameter is gedefinieerd, wordt de handtekening toegevoegd met behulp van GM de MethodBuilder.SetSignature methode. Er is geen retourtype en geen vereiste of aangepaste modifiers, dus alle parameters van deze methode zijn null behalve parameterTypes; parameterTypes stelt het type van de enige parameter van de methode in op , de algemene typeparameter Uvan de methode. De hoofdtekst van de methode maakt een exemplaar van het samengestelde type Sample<U> (Sample(Of U) in Visual Basic), wijst de parameter van de methode toe aan Field en drukt vervolgens de waarde van Field af. De GetField methode wordt gebruikt voor het maken van een FieldInfo veld van het samengestelde algemene type Sample<U> in de OpCodes.Stfld en OpCodes.Ldfld instructies.

Er wordt een dummytype gedefinieerd voor het opslaan van de invoerpuntmethode Main. In de hoofdtekst van Main wordt de statische GM methode aangeroepen op het samengestelde algemene type Sample<int> (Sample(Of Integer) in Visual Basic), met het type String vervangen door U.

Wanneer het codevoorbeeld wordt uitgevoerd, wordt de verzonden assembly opgeslagen als TypeBuilderGetFieldExample.exe. U kunt TypeBuilderGetFieldExample.exeuitvoeren en u kunt de Ildasm.exe (IL Disassembler) gebruiken om de verzonden code te vergelijken met de code voor de Sample klasse die is gecompileerd in het codevoorbeeld zelf.

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

Opmerkingen

De GetField methode biedt een manier om een FieldInfo object op te halen dat een veld vertegenwoordigt van een samengesteld algemeen type waarvan de definitie van het algemene type wordt vertegenwoordigd door een TypeBuilder object.

Stel dat u een TypeBuilder-object hebt dat het type G<T> in C#-syntaxis vertegenwoordigt (G(Of T) in Visual Basic) en een FieldBuilder-object dat een veld public T F in C#-syntaxis (Public F As T in Visual Basic) vertegenwoordigt dat is gedefinieerd door G<T>. Stel dat deze G<T> een algemene methode heeft met een typeparameter U waarmee een exemplaar van het samengestelde type G<U> en het aanroepende veld F voor dat exemplaar wordt gemaakt. Als u de functie-aanroep wilt verzenden, hebt u een FieldInfo object nodig dat staat voor F het samengestelde type, met andere woorden, dat is van het type U in plaats van het type T. U doet dit door eerst de MakeGenericType methode voor het TypeBuilder object aan te roepen, waarbij u het GenericTypeParameterBuilder object opgeeft dat als het typeargument vertegenwoordigt U . Roep vervolgens de GetField methode aan met de retourwaarde van de MakeGenericType methode als parameter type en het FieldBuilder object dat als parameter Fvertegenwoordigtfield. De retourwaarde is het FieldInfo object dat u nodig hebt om de functie-aanroep te verzenden. In het codevoorbeeld ziet u dit scenario.

Van toepassing op

GetField(String, BindingFlags)

Bron:
TypeBuilder.cs

Retourneert het veld dat is opgegeven met de opgegeven naam.

public:
 override System::Reflection::FieldInfo ^ GetField(System::String ^ name, System::Reflection::BindingFlags bindingAttr);
[System.Diagnostics.CodeAnalysis.DynamicallyAccessedMembers(System.Diagnostics.CodeAnalysis.DynamicallyAccessedMemberTypes.NonPublicFields | System.Diagnostics.CodeAnalysis.DynamicallyAccessedMemberTypes.PublicFields)]
public override System.Reflection.FieldInfo? GetField(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);
[<System.Diagnostics.CodeAnalysis.DynamicallyAccessedMembers(System.Diagnostics.CodeAnalysis.DynamicallyAccessedMemberTypes.NonPublicFields | System.Diagnostics.CodeAnalysis.DynamicallyAccessedMemberTypes.PublicFields)>]
override this.GetField : string * System.Reflection.BindingFlags -> System.Reflection.FieldInfo
override this.GetField : string * System.Reflection.BindingFlags -> System.Reflection.FieldInfo
Public Overrides Function GetField (name As String, bindingAttr As BindingFlags) As FieldInfo

Parameters

name
String

De naam van het veld dat moet worden opgehaald.

bindingAttr
BindingFlags

Dit moet een bitvlag zijn van BindingFlags zoals in InvokeMethod, NonPublicenzovoort.

Retouren

Retourneert het FieldInfo object dat het veld vertegenwoordigt dat door dit type is gedeclareerd of overgenomen met de opgegeven naam en openbare of niet-openbare modifier. Als er geen overeenkomsten zijn, null wordt deze geretourneerd.

Kenmerken

Uitzonderingen

Deze methode is niet geïmplementeerd voor onvolledige typen.

Opmerkingen

Haal het type op met behulp van Type.GetType of Assembly.GetType gebruik reflectie op het opgehaalde type.

Van toepassing op