FieldInfo.GetFieldFromHandle Метод

Определение

Получает объект FieldInfo для поля, представленного дескриптором.

Перегрузки

GetFieldFromHandle(RuntimeFieldHandle)

Возвращает значение FieldInfo для поля, представленного указанным дескриптором.

GetFieldFromHandle(RuntimeFieldHandle, RuntimeTypeHandle)

Получает объект FieldInfo для представленного указанным дескриптором поля заданного универсального типа.

GetFieldFromHandle(RuntimeFieldHandle)

Исходный код:
FieldInfo.CoreCLR.cs
Исходный код:
FieldInfo.CoreCLR.cs
Исходный код:
FieldInfo.CoreCLR.cs

Возвращает значение FieldInfo для поля, представленного указанным дескриптором.

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

Параметры

handle
RuntimeFieldHandle

Структура дескрипторов RuntimeFieldHandle, содержащая дескриптор для обработки внутреннего представления поля в метаданных.

Возвращаемое значение

Объект FieldInfo, представляющий поле, указанное параметром handle.

Исключения

handle недопустим.

Примеры

В следующем примере кода метод используется Type.GetFields для получения FieldInfo объектов для полей типа, получает структуру RuntimeFieldHandle для каждого поля, а затем извлекает FieldInfo объекты из дескрипторов с помощью этой перегрузки GetFieldFromHandle метода .

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

Комментарии

Дескрипторы действительны только в том домене приложения, в котором они были получены.

Применяется к

GetFieldFromHandle(RuntimeFieldHandle, RuntimeTypeHandle)

Исходный код:
FieldInfo.CoreCLR.cs
Исходный код:
FieldInfo.CoreCLR.cs
Исходный код:
FieldInfo.CoreCLR.cs

Получает объект FieldInfo для представленного указанным дескриптором поля заданного универсального типа.

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

Параметры

handle
RuntimeFieldHandle

Структура дескрипторов RuntimeFieldHandle, содержащая дескриптор для обработки внутреннего представления поля в метаданных.

declaringType
RuntimeTypeHandle

Структура дескрипторов RuntimeTypeHandle, содержащая дескриптор для обработки универсального типа, который определяет это поле.

Возвращаемое значение

Объект FieldInfo, который представляет поле, определенное дескриптором handle, в универсальном типе, заданном параметром declaringType.

Атрибуты

Исключения

handle недопустим.

-или-

Параметр declaringType несовместим с параметром handle. Например, параметр declaringType представляет дескриптор типа среды выполнения определения универсального типа, а параметр handle поступает из конструируемого типа.

Примеры

В следующем примере показано, как получить FieldInfo объекты для полей в сконструированных универсальных классах. В примере определяется универсальный тип Test<T> (Test(Of T) в Visual Basic) с одним полем с именем TestFieldтипа T. В примере возвращается RuntimeFieldHandle и RuntimeTypeHandle для случая, где T имеет значение String, и демонстрируется следующее:

  • Если используется перегрузка GetFieldFromHandle(RuntimeFieldHandle) метода, возникает исключение. Это верно, даже если поле не относится к типу T.

  • Объект FieldInfo извлекается успешно, если дескриптор типа среды выполнения имеет ту же конструкцию, что и дескриптор поля среды выполнения, в данном случае Test<string>.

  • Если дескриптор типа среды выполнения является из совместимой конструкции, в данном случае Test<object>FieldInfo извлекается для поля в совместимой конструкции.

  • Если дескриптор типа среды выполнения не является совместимым конструкцией, возникает исключение. В этом случае для указывается 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.

Комментарии

Дескрипторы действительны только в том домене приложения, в котором они были получены.

Рекомендуется, что declaringType всегда должен быть дескриптором типа среды выполнения созданного типа, к которому handle относится. То есть, если handle является дескриптором MyType<int> поля среды выполнения для поля, принадлежащего (MyType(Of Integer) в Visual Basic), declaringType является дескриптором типа среды выполнения для MyType<int>. Не используйте дескриптор типа среды выполнения определения универсального типа, если дескриптор поля среды выполнения не представляет поле в определении универсального типа.

В некоторых случаях реализации совместимы. Например, единая реализация является общей для всех типов, созданных на основе определенного определения универсального типа с использованием ссылочных типов для аргументов универсального типа. Например, MyType<string>, MyType<object>и используют одну и MyType<ArrayList> ту же реализацию. В этой ситуации возвращаемый объект представляет поле типа, FieldInfo указывающего declaringType , независимо от исходного источника handle. Этот подход не рекомендуется, так как он работает только в том случае, если аргументы универсального типа сконструированного типа являются ссылочными типами.

Если универсальный аргумент является типом значения, дескриптор типа среды выполнения созданного типа несовместим с дескрипторами полей среды выполнения из конструкций, имеющих ссылочный тип в той же позиции универсального параметра или имеющих другой тип значения в этой позиции. В этом случае единственный способ использовать перегрузку FieldInfo.GetFieldFromHandle(RuntimeFieldHandle, RuntimeTypeHandle) — убедиться, что declaringType является дескриптором типа среды выполнения для созданного типа, к которому handle принадлежит .

Применяется к