FieldInfo.GetFieldFromHandle Metod

Definition

Hämtar en FieldInfo för fältet som representeras av ett handtag.

Överlagringar

Name Description
GetFieldFromHandle(RuntimeFieldHandle)

Hämtar en FieldInfo för fältet som representeras av det angivna handtaget.

GetFieldFromHandle(RuntimeFieldHandle, RuntimeTypeHandle)

Hämtar en FieldInfo för fältet som representeras av den angivna referensen för den angivna generiska typen.

GetFieldFromHandle(RuntimeFieldHandle)

Hämtar en FieldInfo för fältet som representeras av det angivna handtaget.

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

Parametrar

handle
RuntimeFieldHandle

En RuntimeFieldHandle struktur som innehåller handtaget för den interna metadatarepresentationen av ett fält.

Returer

Ett FieldInfo objekt som representerar det fält som anges av handle.

Undantag

handle är ogiltigt.

Exempel

I följande kodexempel används Type.GetFields metoden för att hämta FieldInfo objekt för fält av en typ, hämtar en RuntimeFieldHandle struktur för varje fält och hämtar sedan objekten FieldInfo från handtagen med hjälp av den här överbelastningen GetFieldFromHandle av metoden.

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

Kommentarer

Handtagen är endast giltiga i programdomänen där de hämtades.

Gäller för

GetFieldFromHandle(RuntimeFieldHandle, RuntimeTypeHandle)

Hämtar en FieldInfo för fältet som representeras av den angivna referensen för den angivna generiska typen.

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

Parametrar

handle
RuntimeFieldHandle

En RuntimeFieldHandle struktur som innehåller handtaget för den interna metadatarepresentationen av ett fält.

declaringType
RuntimeTypeHandle

En RuntimeTypeHandle struktur som innehåller handtaget till den generiska typ som definierar fältet.

Returer

Ett FieldInfo objekt som representerar det fält som anges av handle, i den generiska typ som anges av declaringType.

Attribut

Undantag

handle är ogiltigt.

-eller-

declaringType är inte kompatibelt med handle. Är till exempel declaringType körningstyphandtaget för den generiska typdefinitionen och handle kommer från en konstruerad typ.

Exempel

I följande exempel visas hur du hämtar FieldInfo objekt för fält i konstruerade generiska klasser. I exemplet definieras den generiska typen Test<T> (Test(Of T) i Visual Basic) med ett enda fält med namnet TestField, av typen T. Exemplet hämtar RuntimeFieldHandle och RuntimeTypeHandle för det fall där T är String, och visar följande:

  • Ett undantag utlöses om metodöverbelastningen GetFieldFromHandle(RuntimeFieldHandle) används. Detta gäller även om fältet inte är av typen T.

  • A FieldInfo hämtas om körningstypreferensen kommer från samma konstruktion som körningsfälthandtaget, i det här fallet Test<string>.

  • Om handtaget för körningstyp kommer från en kompatibel konstruktion hämtas i det här fallet Test<object>a FieldInfo för fältet på den kompatibla konstruktionen.

  • Om handtaget för körningstyp inte kommer från en kompatibel konstruktion utlöses ett undantag. I det här fallet anges en värdetyp för 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.

Kommentarer

Handtagen är endast giltiga i programdomänen där de hämtades.

Den rekommenderade metoden är att declaringType alltid ska vara körningstypens handtag för den konstruerade typen som handle tillhör. Om handle är ett körningsfälthandtag för ett fält som tillhör MyType<int> (MyType(Of Integer) i Visual Basic), är declaringType körningstypreferensen för MyType<int>. Använd inte körningstyphandtaget för definitionen av allmän typ, såvida inte fälthandtaget för körning representerar ett fält i den generiska typdefinitionen.

Implementeringar är i vissa fall kompatibla. Till exempel delas en enda implementering av alla typer som är konstruerade från en viss generisk typdefinition med hjälp av referenstyper för argument av allmän typ. Till exempel MyType<string>, MyType<object>och MyType<ArrayList> alla delar samma implementering. I det här fallet representerar objektet FieldInfo som returneras ett fält på den typ som declaringType anger, oavsett den ursprungliga källan till handle. Den här metoden rekommenderas inte eftersom den endast fungerar om de generiska typargumenten av den konstruerade typen är referenstyper.

Om ett allmänt argument är en värdetyp är körningstyphandtaget för den konstruerade typen inte kompatibelt med körningsfälthandtag från konstruktioner som har en referenstyp i samma generiska parameterposition eller som har en annan värdetyp i den positionen. I så fall är det enda sättet att använda överbelastningen FieldInfo.GetFieldFromHandle(RuntimeFieldHandle, RuntimeTypeHandle) att se till att declaringType är körningstyphandtaget för den konstruerade typ som handle tillhör.

Gäller för