FieldInfo.GetFieldFromHandle Metoda

Definicja

Pobiera element FieldInfo dla pola reprezentowanego przez uchwyt.

Przeciążenia

GetFieldFromHandle(RuntimeFieldHandle)

Pobiera element FieldInfo dla pola reprezentowanego przez określony uchwyt.

GetFieldFromHandle(RuntimeFieldHandle, RuntimeTypeHandle)

Pobiera wartość FieldInfo dla pola reprezentowanego przez określony uchwyt dla określonego typu ogólnego.

GetFieldFromHandle(RuntimeFieldHandle)

Źródło:
FieldInfo.CoreCLR.cs
Źródło:
FieldInfo.CoreCLR.cs
Źródło:
FieldInfo.CoreCLR.cs

Pobiera element FieldInfo dla pola reprezentowanego przez określony uchwyt.

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

RuntimeFieldHandle Struktura zawierająca uchwyt do wewnętrznej reprezentacji metadanych pola.

Zwraca

FieldInfo Obiekt reprezentujący pole określone przez handle.

Wyjątki

Nazwa handle jest niepoprawna.

Przykłady

Poniższy przykład kodu używa Type.GetFields metody do pobierania FieldInfo obiektów dla pól typu, pobiera strukturę dla każdego pola, a następnie pobiera RuntimeFieldHandleFieldInfo obiekty z uchwytów przy użyciu tego przeciążenia 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

Uwagi

Uchwyty są prawidłowe tylko w domenie aplikacji, w której zostały uzyskane.

Dotyczy

GetFieldFromHandle(RuntimeFieldHandle, RuntimeTypeHandle)

Źródło:
FieldInfo.CoreCLR.cs
Źródło:
FieldInfo.CoreCLR.cs
Źródło:
FieldInfo.CoreCLR.cs

Pobiera wartość FieldInfo dla pola reprezentowanego przez określony uchwyt dla określonego typu ogólnego.

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

RuntimeFieldHandle Struktura zawierająca uchwyt do wewnętrznej reprezentacji metadanych pola.

declaringType
RuntimeTypeHandle

RuntimeTypeHandle Struktura zawierająca uchwyt do typu ogólnego, który definiuje pole.

Zwraca

FieldInfo Obiekt reprezentujący pole określone przez handle, w typie ogólnym określonym przez declaringType.

Atrybuty

Wyjątki

Nazwa handle jest niepoprawna.

-lub-

declaringType nie jest zgodny z programem handle. Na przykład declaringType jest to uchwyt typu środowiska uruchomieniowego definicji typu ogólnego i handle pochodzi z skonstruowanego typu.

Przykłady

W poniższym przykładzie pokazano, jak pobierać FieldInfo obiekty dla pól na skonstruowanych klasach ogólnych. W przykładzie zdefiniowano typ Test<T> ogólny (Test(Of T) w Visual Basic) z pojedynczym polem o nazwie TestField, typu T. Przykład pobiera element RuntimeFieldHandle i RuntimeTypeHandle dla przypadku, w którym T to String, i demonstruje następujące kwestie:

  • Wyjątek jest zgłaszany, jeśli GetFieldFromHandle(RuntimeFieldHandle) jest używane przeciążenie metody. Jest to prawda, nawet jeśli pole nie jest typu T.

  • Element jest FieldInfo pobierany pomyślnie, jeśli uchwyt typu środowiska uruchomieniowego pochodzi z tej samej konstrukcji co uchwyt pola środowiska uruchomieniowego, w tym przypadku Test<string>.

  • Jeśli uchwyt typu środowiska uruchomieniowego pochodzi z zgodnej konstrukcji, w tym przypadku Test<object>FieldInfo zostanie pobrane pole dla pola na zgodnej konstrukcji.

  • Jeśli uchwyt typu środowiska uruchomieniowego nie pochodzi z zgodnej konstrukcji, zgłaszany jest wyjątek. W tym przypadku typ wartości jest określony dla Telementu .

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.

Uwagi

Uchwyty są prawidłowe tylko w domenie aplikacji, w której zostały uzyskane.

Zalecaną praktyką jest to, że declaringType zawsze powinien być uchwyt typu środowiska uruchomieniowego skonstruowanego typu, który handle należy do. Oznacza to, że jeśli handle jest uchwytem pola środowiska uruchomieniowego dla pola należącego do MyType<int> (MyType(Of Integer) w Visual Basic), declaringType jest uchwyt typu środowiska uruchomieniowego dla MyType<int>. Nie używaj uchwytu typu środowiska uruchomieniowego definicji typu ogólnego, chyba że uchwyt pola środowiska uruchomieniowego reprezentuje pole w definicji typu ogólnego.

Implementacje są zgodne w niektórych przypadkach. Na przykład pojedyncza implementacja jest współużytkowana przez wszystkie typy, które są konstruowane z określonej definicji typu ogólnego przy użyciu typów referencyjnych dla argumentów typu ogólnego. Na przykład , MyType<string>MyType<object>i MyType<ArrayList> wszystkie współdzielą tę samą implementację. W takiej sytuacji FieldInfo zwracany obiekt reprezentuje pole określonego typu declaringType , niezależnie od oryginalnego handleźródła . Ta praktyka nie jest zalecana, ponieważ działa tylko wtedy, gdy argumenty typu ogólnego typu konstruowanego są typami referencyjnymi.

Jeśli argument ogólny jest typem wartości, uchwyt typu środowiska uruchomieniowego skonstruowanego typu nie jest zgodny z uchwytami pól środowiska uruchomieniowego z konstrukcji, które mają typ odwołania w tej samej pozycji parametru ogólnego lub które mają inny typ wartości w tej pozycji. W takim przypadku jedynym sposobem użycia FieldInfo.GetFieldFromHandle(RuntimeFieldHandle, RuntimeTypeHandle) przeciążenia jest upewnienie się, że declaringType jest to uchwyt typu środowiska uruchomieniowego dla skonstruowanego typu, który handle należy do.

Dotyczy