Freigeben über


FieldInfo.GetFieldFromHandle Methode

Definition

Ruft eine FieldInfo für das durch ein Handle dargestellte Feld ab.

Überlädt

GetFieldFromHandle(RuntimeFieldHandle)

Ruft eine FieldInfo für das durch das angegebene Handle dargestellte Feld ab.

GetFieldFromHandle(RuntimeFieldHandle, RuntimeTypeHandle)

Ruft eine FieldInfo für das durch das angegebene Handle dargestellte Feld für den angegebenen generischen Typ ab.

GetFieldFromHandle(RuntimeFieldHandle)

Quelle:
FieldInfo.CoreCLR.cs
Quelle:
FieldInfo.CoreCLR.cs
Quelle:
FieldInfo.CoreCLR.cs

Ruft eine FieldInfo für das durch das angegebene Handle dargestellte Feld ab.

public:
 static System::Reflection::FieldInfo ^ GetFieldFromHandle(RuntimeFieldHandle handle);
public static System.Reflection.FieldInfo GetFieldFromHandle (RuntimeFieldHandle handle);
static member GetFieldFromHandle : RuntimeFieldHandle -> System.Reflection.FieldInfo
Public Shared Function GetFieldFromHandle (handle As RuntimeFieldHandle) As FieldInfo

Parameter

handle
RuntimeFieldHandle

Eine RuntimeFieldHandle-Struktur, die das Handle für die interne Metadatendarstellung eines Felds enthält.

Gibt zurück

Ein FieldInfo-Objekt, das das durch handle angegebene Feld darstellt.

Ausnahmen

handle ist ungültig.

Beispiele

Im folgenden Codebeispiel wird die Type.GetFields -Methode verwendet, um Objekte für die Felder eines Typs abzurufen FieldInfo , ruft eine RuntimeFieldHandle Struktur für jedes Feld ab und ruft dann die FieldInfo Objekte mithilfe dieser Überladung der GetFieldFromHandle -Methode aus den Handles ab.

using namespace System;
using namespace System::Reflection;

public ref class FieldInfo_GetFieldFromHandle
{
public:
   String^ x;
   Char y;
   float a;
   int b;
};

int main()
{
   // Get the type of the FieldInfo_GetFieldFromHandle class.
   Type^ myType = FieldInfo_GetFieldFromHandle::typeid;

   // Get the fields of the FieldInfo_GetFieldFromHandle class.
   array<FieldInfo^>^myFieldInfoArray = myType->GetFields();
   Console::WriteLine( "\nThe field information of the declared  fields x, y, a, and b is:\n" );
   RuntimeFieldHandle myRuntimeFieldHandle;
   for ( int i = 0; i < myFieldInfoArray->Length; i++ )
   {
      // Get the RuntimeFieldHandle of myFieldInfoArray.
      myRuntimeFieldHandle = myFieldInfoArray[ i ]->FieldHandle;

      // Call the GetFieldFromHandle method. 
      FieldInfo^ myFieldInfo = FieldInfo::GetFieldFromHandle( myRuntimeFieldHandle );

      // Display the FieldInfo of myFieldInfo.
      Console::WriteLine( " {0}", myFieldInfo );
   }
}
using System;
using System.Reflection;

public class FieldInfo_GetFieldFromHandle
{
    public string x;
    public char y;
    public float a;
    public int b;

    public static void Main()
    {
        // Get the type of the FieldInfo_GetFieldFromHandle class.
        Type myType = typeof(FieldInfo_GetFieldFromHandle);
        // Get the fields of the FieldInfo_GetFieldFromHandle class.
        FieldInfo [] myFieldInfoArray = myType.GetFields();
        Console.WriteLine("\nThe field information of the declared" +
            " fields x, y, a, and b is:\n");
        RuntimeFieldHandle myRuntimeFieldHandle;
        for(int i = 0; i < myFieldInfoArray.Length; i++)
        {
            // Get the RuntimeFieldHandle of myFieldInfoArray.
            myRuntimeFieldHandle = myFieldInfoArray[i].FieldHandle;
            // Call the GetFieldFromHandle method.
            FieldInfo myFieldInfo = FieldInfo.GetFieldFromHandle(myRuntimeFieldHandle);
            // Display the FieldInfo of myFieldInfo.
            Console.WriteLine("{0}", myFieldInfo);
        }
    }
}
Imports System.Reflection

Public Class FieldInfo_GetFieldFromHandle
    Public x As String
    Public y As Char
    Public a As Single
    Public b As Integer

    Public Shared Sub Main()
        ' Get the type of the FieldInfo_GetFieldFromHandle class.
        Dim myType As Type = GetType(FieldInfo_GetFieldFromHandle)
        ' Get the fields of the FieldInfo_GetFieldFromHandle class.
        Dim myFieldInfoArray As FieldInfo() = myType.GetFields()
        Console.WriteLine(ControlChars.NewLine & _
           "The field information of the declared" & _
           " fields x, y, a, and b is:" & ControlChars.NewLine)
        Dim myRuntimeFieldHandle As RuntimeFieldHandle
        Dim i As Integer
        For i = 0 To myFieldInfoArray.Length - 1
            ' Get the RuntimeFieldHandle of myFieldInfoArray.
            myRuntimeFieldHandle = myFieldInfoArray(i).FieldHandle
            ' Call the GetFieldFromHandle method. 
            Dim myFieldInfo As FieldInfo = FieldInfo.GetFieldFromHandle(myRuntimeFieldHandle)
            ' Display the FieldInfo of myFieldInfo.
            Console.WriteLine("{0}", myFieldInfo)
        Next i
    End Sub
End Class

Hinweise

Handles sind nur in der Anwendungsdomäne gültig, in der sie abgerufen wurden.

Gilt für:

GetFieldFromHandle(RuntimeFieldHandle, RuntimeTypeHandle)

Quelle:
FieldInfo.CoreCLR.cs
Quelle:
FieldInfo.CoreCLR.cs
Quelle:
FieldInfo.CoreCLR.cs

Ruft eine FieldInfo für das durch das angegebene Handle dargestellte Feld für den angegebenen generischen Typ ab.

public:
 static System::Reflection::FieldInfo ^ GetFieldFromHandle(RuntimeFieldHandle handle, RuntimeTypeHandle declaringType);
public static System.Reflection.FieldInfo GetFieldFromHandle (RuntimeFieldHandle handle, RuntimeTypeHandle declaringType);
[System.Runtime.InteropServices.ComVisible(false)]
public static System.Reflection.FieldInfo GetFieldFromHandle (RuntimeFieldHandle handle, RuntimeTypeHandle declaringType);
static member GetFieldFromHandle : RuntimeFieldHandle * RuntimeTypeHandle -> System.Reflection.FieldInfo
[<System.Runtime.InteropServices.ComVisible(false)>]
static member GetFieldFromHandle : RuntimeFieldHandle * RuntimeTypeHandle -> System.Reflection.FieldInfo
Public Shared Function GetFieldFromHandle (handle As RuntimeFieldHandle, declaringType As RuntimeTypeHandle) As FieldInfo

Parameter

handle
RuntimeFieldHandle

Eine RuntimeFieldHandle-Struktur, die das Handle für die interne Metadatendarstellung eines Felds enthält.

declaringType
RuntimeTypeHandle

Eine RuntimeTypeHandle-Struktur, die das Handle für den generischen Typ enthält, der das Feld definiert.

Gibt zurück

Ein FieldInfo-Objekt, das das von handle angegebene Feld darstellt, in dem durch declaringType angegebenen generischen Typ.

Attribute

Ausnahmen

handle ist ungültig.

- oder -

declaringType ist nicht mit handle kompatibel. Beispielsweise ist declaringType das Laufzeittyphandle der generischen Typdefinition, und handle stammt von einem konstruierten Typ.

Beispiele

Das folgende Beispiel zeigt, wie Objekte für Felder in konstruierten generischen Klassen abgerufen werden FieldInfo . Das Beispiel definiert den generischen Typ Test<T> (Test(Of T) in Visual Basic) mit einem einzelnen Feld namens TestFieldvom Typ T. Das Beispiel ruft und RuntimeFieldHandleRuntimeTypeHandle für den Fall ab, in dem TStringist, und veranschaulicht Folgendes:

  • Eine Ausnahme wird ausgelöst, wenn die GetFieldFromHandle(RuntimeFieldHandle) Methodenüberladung verwendet wird. Dies gilt auch dann, wenn das Feld nicht vom Typ Tist.

  • Ein FieldInfo wird erfolgreich abgerufen, wenn das Laufzeittyphandle aus derselben Konstruktion wie das Laufzeitfeldhandle stammt, in diesem Fall Test<string>.

  • Wenn das Laufzeittyphandle aus einer kompatiblen Konstruktion stammt, in diesem Fall Test<object>, wird ein FieldInfo für das Feld in der kompatiblen Konstruktion abgerufen.

  • Wenn das Laufzeittyphandle nicht aus einer kompatiblen Konstruktion stammt, wird eine Ausnahme ausgelöst. In diesem Fall wird für Tein Werttyp angegeben.

using System;
using System.Reflection;

// A generic class with a field whose type is specified by the
// generic type parameter of the class.
public class Test<T>
{
    public T TestField;
}

public class Example
{
    public static void Main()
    {
        // Get type handles for Test<String> and its field.
        RuntimeTypeHandle rth = typeof(Test<string>).TypeHandle;
        RuntimeFieldHandle rfh = typeof(Test<string>).GetField("TestField").FieldHandle;

        // When a field belongs to a constructed generic type,
        // such as Test<String>, retrieving the field from the
        // field handle requires the type handle of the constructed
        // generic type. An exception is thrown if the type is not
        // included.
        try
        {
            FieldInfo f1 = FieldInfo.GetFieldFromHandle(rfh);
        }
        catch(Exception ex)
        {
            Console.WriteLine("{0}: {1}", ex.GetType().Name, ex.Message);
        }

        // To get the FieldInfo for a field on a generic type, use the
        // overload that specifies the type handle.
        FieldInfo fi = FieldInfo.GetFieldFromHandle(rfh, rth);
        Console.WriteLine("\r\nThe type of {0} is: {1}", fi.Name, fi.FieldType);

        // All constructions of Test<T> for which T is a reference
        // type share the same implementation, so the same runtime
        // field handle can be used to retrieve the FieldInfo for
        // TestField on any such construction. Here the runtime field
        // handle is used with Test<Object>.
        fi = FieldInfo.GetFieldFromHandle(rfh, typeof(Test<object>).TypeHandle);
        Console.WriteLine("\r\nThe type of {0} is: {1}", fi.Name, fi.FieldType);

        // Each construction of Test<T> for which T is a value type
        // has its own unique implementation, and an exception is thrown
        // if you supply a constructed type other than the one that
        // the runtime field handle belongs to.
        try
        {
            fi = FieldInfo.GetFieldFromHandle(rfh, typeof(Test<int>).TypeHandle);
        }
        catch(Exception ex)
        {
            Console.WriteLine("\r\n{0}: {1}", ex.GetType().Name, ex.Message);
        }
    }
}

/* This code example produces output similar to the following:

ArgumentException: Cannot resolve field TestField because the declaring type of
the field handle Test`1[T] is generic. Explicitly provide the declaring type to
GetFieldFromHandle.

The type of TestField is: System.String

The type of TestField is: System.Object

ArgumentException: Type handle 'Test`1[System.Int32]' and field handle with decl
aring type 'Test`1[System.__Canon]' are incompatible. Get RuntimeFieldHandle and
 declaring RuntimeTypeHandle off the same FieldInfo.
 */
Imports System.Reflection

' A generic class with a field whose type is specified by the 
' generic type parameter of the class.
Public Class Test(Of T)
    Public TestField As T 
End Class

Public Class Example

    Public Shared Sub Main()

        ' Get type handles for Test(Of String) and its field.
        Dim rth As RuntimeTypeHandle = _
            GetType(Test(Of String)).TypeHandle
        Dim rfh As RuntimeFieldHandle = _
            GetType(Test(Of String)).GetField("TestField").FieldHandle

        ' When a field belongs to a constructed generic type, 
        ' such as Test(Of String), retrieving the field from the
        ' field handle requires the type handle of the constructed
        ' generic type. An exception is thrown if the type is not
        ' included.
        Try
            Dim f1 As FieldInfo = FieldInfo.GetFieldFromHandle(rfh)
        Catch ex As Exception
            Console.WriteLine("{0}: {1}", ex.GetType().Name, ex.Message)
        End Try

        ' To get the FieldInfo for a field on a generic type, use the
        ' overload that specifies the type handle.
        Dim fi As FieldInfo = FieldInfo.GetFieldFromHandle(rfh, rth)
        Console.WriteLine(vbCrLf & "The type of {0} is: {1}", _
            fi.Name, fi.FieldType)

        ' All constructions of Test(Of T) for which T is a reference
        ' type share the same implementation, so the same runtime 
        ' field handle can be used to retrieve the FieldInfo for 
        ' TestField on any such construction. Here the runtime field
        ' handle is used with Test(Of Object).
        fi = FieldInfo.GetFieldFromHandle(rfh, _
                               GetType(Test(Of Object)).TypeHandle)
        Console.WriteLine(vbCrLf & "The type of {0} is: {1}", _
            fi.Name, fi.FieldType)

        ' Each construction of Test(Of T) for which T is a value type
        ' has its own unique implementation, and an exception is thrown
        ' if you supply a constructed type other than the one that 
        ' the runtime field handle belongs to.  
        Try
            fi = FieldInfo.GetFieldFromHandle(rfh, _
                               GetType(Test(Of Integer)).TypeHandle)
        Catch ex As Exception
            Console.WriteLine(vbCrLf & "{0}: {1}", ex.GetType().Name, ex.Message)
        End Try

    End Sub
End Class

' This code example produces output similar to the following:
'
'ArgumentException: Cannot resolve field TestField because the declaring type of
'the field handle Test`1[T] is generic. Explicitly provide the declaring type to
'GetFieldFromHandle.
'
'The type of TestField is: System.String
'
'The type of TestField is: System.Object
'
'ArgumentException: Type handle 'Test`1[System.Int32]' and field handle with decl
'aring type 'Test`1[System.__Canon]' are incompatible. Get RuntimeFieldHandle and
' declaring RuntimeTypeHandle off the same FieldInfo.

Hinweise

Handles sind nur in der Anwendungsdomäne gültig, in der sie abgerufen wurden.

Die empfohlene Vorgehensweise ist, dass declaringType immer das Laufzeittyphandle des konstruierten Typs sein sollte, handle zu dem gehört. Das heißt, wenn handle ein Laufzeitfeldhandle für ein Feld ist, das zu MyType<int> gehört (MyType(Of Integer) in Visual Basic), declaringType ist das Laufzeittyphandle für MyType<int>. Verwenden Sie nicht das Laufzeittyphandle der generischen Typdefinition, es sei denn, das Laufzeitfeldhandle stellt ein Feld in der generischen Typdefinition dar.

Implementierungen sind in einigen Fällen kompatibel. Beispielsweise wird eine einzelne Implementierung von allen Typen gemeinsam verwendet, die aus einer bestimmten generischen Typdefinition erstellt werden, indem Verweistypen für die generischen Typargumente verwendet werden. Beispielsweise MyType<string>teilen sich , MyType<object>und MyType<ArrayList> alle die gleiche Implementierung. In diesem Fall stellt das FieldInfo zurückgegebene Objekt ein Feld für den Typ declaringType dar, der angibt, unabhängig von der ursprünglichen Quelle von handle. Diese Vorgehensweise wird nicht empfohlen, da sie nur funktioniert, wenn die generischen Typargumente des konstruierten Typs Verweistypen sind.

Wenn ein generisches Argument ein Werttyp ist, ist das Laufzeittyphandle des konstruierten Typs nicht kompatibel mit Laufzeitfeldhandles von Konstruktionen, die einen Verweistyp an derselben generischen Parameterposition oder einen anderen Werttyp an dieser Position aufweisen. In diesem Fall besteht die einzige Möglichkeit zur Verwendung der FieldInfo.GetFieldFromHandle(RuntimeFieldHandle, RuntimeTypeHandle) Überladung darin, sicherzustellen, dass declaringType das Laufzeittyphandle für den konstruierten Typ, zu dem gehört, handle ist.

Gilt für: