Sdílet prostřednictvím


FieldInfo.GetFieldFromHandle Metoda

Definice

Získá pro FieldInfo pole reprezentované popisovačem.

Přetížení

GetFieldFromHandle(RuntimeFieldHandle)

FieldInfo Získá pro pole reprezentované zadaným popisovačem.

GetFieldFromHandle(RuntimeFieldHandle, RuntimeTypeHandle)

FieldInfo Získá pro pole reprezentované zadaným popisovačem pro zadaný obecný typ.

GetFieldFromHandle(RuntimeFieldHandle)

Zdroj:
FieldInfo.CoreCLR.cs
Zdroj:
FieldInfo.CoreCLR.cs
Zdroj:
FieldInfo.CoreCLR.cs

FieldInfo Získá pro pole reprezentované zadaným popisovačem.

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

Parametry

handle
RuntimeFieldHandle

Struktura RuntimeFieldHandle , která obsahuje popisovač pro reprezentaci interních metadat pole.

Návraty

Objekt FieldInfo představující pole určené parametrem handle.

Výjimky

Formát handle je neplatný.

Příklady

Následující příklad kódu používá metodu Type.GetFields k získání FieldInfo objektů pro pole typu, získá RuntimeFieldHandle strukturu pro každé pole a pak načte FieldInfo objekty z popisovačů pomocí tohoto přetížení GetFieldFromHandle metody .

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

Poznámky

Popisovače jsou platné pouze v doméně aplikace, ve které byly získány.

Platí pro

GetFieldFromHandle(RuntimeFieldHandle, RuntimeTypeHandle)

Zdroj:
FieldInfo.CoreCLR.cs
Zdroj:
FieldInfo.CoreCLR.cs
Zdroj:
FieldInfo.CoreCLR.cs

FieldInfo Získá pro pole reprezentované zadaným popisovačem pro zadaný obecný typ.

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

Parametry

handle
RuntimeFieldHandle

Struktura RuntimeFieldHandle , která obsahuje popisovač pro reprezentaci interních metadat pole.

declaringType
RuntimeTypeHandle

Struktura RuntimeTypeHandle , která obsahuje popisovač obecného typu, který definuje pole.

Návraty

Objekt FieldInfo představující pole určené parametrem handlev obecném typu určeném parametrem declaringType.

Atributy

Výjimky

Formát handle je neplatný.

-nebo-

declaringType není kompatibilní s handlenástrojem . Například declaringType je popisovač typu modulu runtime definice obecného typu a handle pochází z vytvořeného typu.

Příklady

Následující příklad ukazuje, jak načíst FieldInfo objekty pro pole ve vytvořených obecných třídách. Příklad definuje obecný typ Test<T> (Test(Of T) v jazyce Visual Basic) s jedním polem s názvem TestField, typu T. Příklad získá RuntimeFieldHandle a RuntimeTypeHandle pro případ, kdy T je String, a ukazuje následující:

  • Pokud se použije přetížení metody, vyvolá GetFieldFromHandle(RuntimeFieldHandle) se výjimka. To platí i v případě, že pole není typu T.

  • A FieldInfo se úspěšně načte, pokud je popisovač typu modulu runtime ze stejné konstrukce jako popisovač pole modulu runtime, v tomto případě Test<string>.

  • Pokud je popisovač typu modulu runtime z kompatibilní konstrukce, v tomto případě Test<object>, FieldInfo načte se pro pole na kompatibilní konstrukci.

  • Pokud popisovač typu modulu runtime nepochází z kompatibilní konstrukce, vyvolá se výjimka. V tomto případě je pro Tzadaný typ hodnoty .

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.

Poznámky

Popisovače jsou platné pouze v doméně aplikace, ve které byly získány.

Doporučeným postupem je, že declaringType by vždy měl být popisovač typu modulu runtime vytvořeného typu, ke kterému handle patří. To znamená, že pokud handle je popisovač pole modulu runtime pro pole, které patří do MyType<int> (MyType(Of Integer) v jazyce Visual Basic), declaringType je popisovač typu modulu runtime pro MyType<int>. Nepoužívejte popisovač typu modulu runtime definice obecného typu, pokud popisovač pole modulu runtime představuje pole v definici obecného typu.

Implementace jsou v některých případech kompatibilní. Například jedna implementace je sdílena všemi typy, které jsou vytvořeny z definice konkrétního obecného typu pomocí odkazových typů pro argumenty obecného typu. Například MyType<string>, MyType<object>a MyType<ArrayList> všechny sdílejí stejnou implementaci. V této situaci FieldInfo vrácený objekt představuje pole typu, který declaringType určuje, bez ohledu na původní zdroj handle. Tento postup se nedoporučuje, protože funguje pouze v případě, že argumenty obecného typu konstruovaného typu jsou odkazovými typy.

Pokud je obecným argumentem typ hodnoty, popisovač typu modulu runtime vytvořeného typu není kompatibilní s popisovači polí modulu runtime z konstrukcí, které mají odkazový typ ve stejné pozici obecného parametru nebo které mají na této pozici jiný typ hodnoty. V takovém případě je jediným způsobem, jak použít FieldInfo.GetFieldFromHandle(RuntimeFieldHandle, RuntimeTypeHandle) přetížení, zajistit, že declaringType je popisovač typu modulu runtime pro konstruovaný typ, ke kterému handle patří.

Platí pro