FieldInfo.GetFieldFromHandle Метод
Определение
Важно!
Некоторые сведения относятся к предварительной версии продукта, в которую до выпуска могут быть внесены существенные изменения. Майкрософт не предоставляет никаких гарантий, явных или подразумеваемых, относительно приведенных здесь сведений.
FieldInfo Возвращает поле для поля, представленного дескриптором.
Перегрузки
| Имя | Описание |
|---|---|
| GetFieldFromHandle(RuntimeFieldHandle) |
FieldInfo Возвращает поле, представленное указанным дескриптором. |
| GetFieldFromHandle(RuntimeFieldHandle, RuntimeTypeHandle) |
FieldInfo Возвращает поле, представленное указанным дескриптором, для указанного универсального типа. |
GetFieldFromHandle(RuntimeFieldHandle)
- Исходный код:
- FieldInfo.CoreCLR.cs
- Исходный код:
- FieldInfo.CoreCLR.cs
- Исходный код:
- 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 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.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 к которому принадлежит.