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
принадлежит .