FieldInfo.GetFieldFromHandle Yöntem

Tanım

FieldInfo Tanıtıcıyla temsil edilen alan için bir alır.

Aşırı Yüklemeler

GetFieldFromHandle(RuntimeFieldHandle)

Belirtilen tanıtıcı tarafından temsil edilen alan için bir FieldInfo alır.

GetFieldFromHandle(RuntimeFieldHandle, RuntimeTypeHandle)

Belirtilen genel tür için belirtilen tanıtıcı tarafından temsil edilen alan için bir FieldInfo alır.

GetFieldFromHandle(RuntimeFieldHandle)

Kaynak:
FieldInfo.CoreCLR.cs
Kaynak:
FieldInfo.CoreCLR.cs
Kaynak:
FieldInfo.CoreCLR.cs

Belirtilen tanıtıcı tarafından temsil edilen alan için bir FieldInfo alır.

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

Parametreler

handle
RuntimeFieldHandle

Bir RuntimeFieldHandle alanın iç meta veri gösteriminin tutamacını içeren yapı.

Döndürülenler

FieldInfo tarafından handlebelirtilen alanı temsil eden bir nesne.

Özel durumlar

handle geçersizdir.

Örnekler

Aşağıdaki kod örneği, bir türdeki alanların nesnelerini almak için yöntemini kullanırType.GetFields, her alan için bir RuntimeFieldHandle yapı alır ve ardından yönteminin bu aşırı yüklemesini GetFieldFromHandle kullanarak nesneleri tanıtıcılardan alırFieldInfo.FieldInfo

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

Açıklamalar

Tanıtıcılar yalnızca elde edildikleri uygulama etki alanında geçerlidir.

Şunlara uygulanır

GetFieldFromHandle(RuntimeFieldHandle, RuntimeTypeHandle)

Kaynak:
FieldInfo.CoreCLR.cs
Kaynak:
FieldInfo.CoreCLR.cs
Kaynak:
FieldInfo.CoreCLR.cs

Belirtilen genel tür için belirtilen tanıtıcı tarafından temsil edilen alan için bir FieldInfo alır.

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

Parametreler

handle
RuntimeFieldHandle

Bir RuntimeFieldHandle alanın iç meta veri gösteriminin tutamacını içeren yapı.

declaringType
RuntimeTypeHandle

RuntimeTypeHandle Alanı tanımlayan genel türün tutamacını içeren yapı.

Döndürülenler

FieldInfo tarafından handledeclaringTypebelirtilen genel türde alanını temsil eden bir nesne.

Öznitelikler

Özel durumlar

handle geçersizdir.

-veya-

declaringType ile handleuyumlu değildir. Örneğin, declaringType genel tür tanımının çalışma zamanı türü tanıtıcısıdır ve handle bir yapılı türden gelir.

Örnekler

Aşağıdaki örnekte, yapılı genel sınıflardaki alanlar için nesnelerin nasıl alınacakları FieldInfo gösterilmektedir. Örnek, genel türü Test<T> (Test(Of T)Visual Basic'te) türünde adlı TestFieldTtek bir alanla tanımlar. Örnek, öğesinin RuntimeFieldHandle olduğu TStringdurum için ve RuntimeTypeHandle değerini alır ve aşağıdakileri gösterir:

  • Yöntem aşırı yüklemesi kullanılırsa GetFieldFromHandle(RuntimeFieldHandle) bir özel durum oluşturulur. Bu, alan türünde Tolmasa bile geçerlidir.

  • Çalışma FieldInfo zamanı türü tanıtıcısı, çalışma zamanı alan tanıtıcısıyla aynı yapıdansa , bu durumda Test<string>başarılı bir şekilde alınır.

  • Çalışma zamanı türü tanıtıcısı uyumlu bir yapıdansa, bu durumda Test<object>, uyumlu yapıdaki alan için bir FieldInfo alınır.

  • Çalışma zamanı türü tanıtıcısı uyumlu bir yapıdan değilse, bir özel durum oluşturulur. Bu durumda için bir değer türü belirtilir 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.

Açıklamalar

Tanıtıcılar yalnızca elde edildikleri uygulama etki alanında geçerlidir.

Önerilen uygulama, declaringType her zaman ait olan yapılı türün çalışma zamanı türü handle tanıtıcısı olmasıdır. Başka bir ifadeyle, handle (MyType(Of Integer) Visual Basic'te) ait MyType<int> bir alanın çalışma zamanı alan tutamacı ise, declaringType için MyType<int>çalışma zamanı türü tanıtıcısıdır. Çalışma zamanı alan tutamacı genel tür tanımındaki bir alanı temsil etmediği sürece, genel tür tanımının çalışma zamanı türü tutamacını kullanmayın.

Bazı durumlarda uygulamalar uyumludur. Örneğin, tek bir uygulama, genel tür bağımsız değişkenleri için başvuru türleri kullanılarak belirli bir genel tür tanımından oluşturulmuş tüm türler tarafından paylaşılır. Örneğin, MyType<string>, MyType<object>ve MyType<ArrayList> tümü aynı uygulamayı paylaşır. Bu durumda, FieldInfo döndürülen nesne, özgün kaynağından handlebağımsız olarak, türünde belirten declaringType bir alanı temsil eder. Bu uygulama önerilmez, çünkü yalnızca, oluşturulur türün genel tür bağımsız değişkenleri başvuru türleri olduğunda çalışır.

Genel bağımsız değişken bir değer türüyse, oluşturulan türün çalışma zamanı türü tanıtıcısı, aynı genel parametre konumunda bir başvuru türüne sahip olan veya bu konumda farklı bir değer türüne sahip olan yapılardaki çalışma zamanı alan tanıtıcılarıyla uyumlu değildir. Bu durumda, aşırı yüklemeyi kullanmanın FieldInfo.GetFieldFromHandle(RuntimeFieldHandle, RuntimeTypeHandle) tek yolu, ait olan yapılı tür için çalışma zamanı türü tanıtıcısının olduğundan handle emin olmaktırdeclaringType.

Şunlara uygulanır