Bagikan melalui


FieldInfo.GetFieldFromHandle Metode

Definisi

FieldInfo Mendapatkan untuk bidang yang diwakili oleh handel.

Overload

GetFieldFromHandle(RuntimeFieldHandle)

Mendapatkan untuk bidang yang FieldInfo diwakili oleh handel yang ditentukan.

GetFieldFromHandle(RuntimeFieldHandle, RuntimeTypeHandle)

Mendapatkan untuk bidang yang FieldInfo diwakili oleh handel yang ditentukan, untuk jenis generik yang ditentukan.

GetFieldFromHandle(RuntimeFieldHandle)

Sumber:
FieldInfo.CoreCLR.cs
Sumber:
FieldInfo.CoreCLR.cs
Sumber:
FieldInfo.CoreCLR.cs

Mendapatkan untuk bidang yang FieldInfo diwakili oleh handel yang ditentukan.

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

Struktur RuntimeFieldHandle yang berisi handel ke representasi metadata internal bidang.

Mengembalikan

Objek FieldInfo yang mewakili bidang yang ditentukan oleh handle.

Pengecualian

handle tidak valid.

Contoh

Contoh kode berikut menggunakan Type.GetFields metode untuk mendapatkan FieldInfo objek untuk bidang jenis, mendapatkan RuntimeFieldHandle struktur untuk setiap bidang, lalu mengambil FieldInfo objek dari handel menggunakan kelebihan beban GetFieldFromHandle metode ini.

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

Keterangan

Handel hanya valid di domain aplikasi tempat mereka diperoleh.

Berlaku untuk

GetFieldFromHandle(RuntimeFieldHandle, RuntimeTypeHandle)

Sumber:
FieldInfo.CoreCLR.cs
Sumber:
FieldInfo.CoreCLR.cs
Sumber:
FieldInfo.CoreCLR.cs

Mendapatkan untuk bidang yang FieldInfo diwakili oleh handel yang ditentukan, untuk jenis generik yang ditentukan.

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

Struktur RuntimeFieldHandle yang berisi handel ke representasi metadata internal bidang.

declaringType
RuntimeTypeHandle

RuntimeTypeHandle Struktur yang berisi handel ke jenis generik yang menentukan bidang .

Mengembalikan

Objek FieldInfo yang mewakili bidang yang ditentukan oleh handle, dalam jenis generik yang ditentukan oleh declaringType.

Atribut

Pengecualian

handle tidak valid.

-atau-

declaringType tidak kompatibel dengan handle. Misalnya, declaringType adalah handel jenis runtime dari definisi jenis generik, dan handle berasal dari jenis yang dibangun.

Contoh

Contoh berikut menunjukkan cara mengambil FieldInfo objek untuk bidang pada kelas generik yang dibangun. Contoh menentukan jenis Test<T> generik (Test(Of T) di Visual Basic) dengan satu bidang bernama TestField, dari jenis T. Contohnya mendapatkan RuntimeFieldHandle dan RuntimeTypeHandle untuk kasus di mana T adalah String, dan menunjukkan hal berikut:

  • Pengecualian dilemparkan jika GetFieldFromHandle(RuntimeFieldHandle) metode kelebihan beban digunakan. Ini benar meskipun bidang tidak berjenis T.

  • FieldInfo berhasil diambil jika handel jenis runtime berasal dari konstruksi yang sama dengan handel bidang runtime, dalam hal Test<string>ini .

  • Jika handel jenis runtime berasal dari konstruksi yang kompatibel, dalam hal Test<object>ini , FieldInfo untuk bidang pada konstruksi yang kompatibel diambil.

  • Jika handel jenis runtime bukan dari konstruksi yang kompatibel, pengecualian akan dilemparkan. Dalam hal ini, jenis nilai ditentukan untuk T.

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.

Keterangan

Handel hanya valid di domain aplikasi tempat mereka diperoleh.

Praktik yang direkomendasikan adalah harus declaringType selalu menjadi handel jenis runtime dari jenis yang dibangun miliknya handle . Artinya, jika handle adalah handel bidang runtime untuk bidang milik MyType<int> (MyType(Of Integer) di Visual Basic), declaringType adalah handel jenis runtime untuk MyType<int>. Jangan gunakan handel jenis runtime definisi jenis generik, kecuali handel bidang runtime mewakili bidang pada definisi jenis generik.

Implementasi kompatibel dalam beberapa kasus. Misalnya, implementasi tunggal dibagikan oleh semua jenis yang dibangun dari definisi jenis generik tertentu dengan menggunakan jenis referensi untuk argumen jenis generik. Misalnya, MyType<string>, MyType<object>, dan MyType<ArrayList> semua berbagi implementasi yang sama. Dalam situasi ini, FieldInfo objek yang dikembalikan mewakili bidang pada jenis yang declaringType menentukan, terlepas dari sumber asli .handle Praktik ini tidak disarankan, karena hanya berfungsi jika argumen jenis generik dari jenis yang dibangun adalah jenis referensi.

Jika argumen generik adalah jenis nilai, handel jenis runtime dari jenis yang dibangun tidak kompatibel dengan handel bidang runtime dari konstruksi yang memiliki jenis referensi dalam posisi parameter generik yang sama, atau yang memiliki jenis nilai yang berbeda dalam posisi tersebut. Dalam hal ini, satu-satunya cara untuk menggunakan FieldInfo.GetFieldFromHandle(RuntimeFieldHandle, RuntimeTypeHandle) kelebihan beban adalah dengan memastikan bahwa declaringType adalah handel jenis runtime untuk jenis yang dibangun miliknya handle .

Berlaku untuk