Type.GetFields Метод

Определение

Возвращает поля текущего Type.

Перегрузки

Имя Описание
GetFields()

Возвращает все открытые поля текущего Type.

GetFields(BindingFlags)

При переопределении в производном классе выполняет поиск полей, определенных для текущего Type, с использованием указанных ограничений привязки.

GetFields()

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

Возвращает все открытые поля текущего Type.

public:
 cli::array <System::Reflection::FieldInfo ^> ^ GetFields();
public:
 virtual cli::array <System::Reflection::FieldInfo ^> ^ GetFields();
[System.Diagnostics.CodeAnalysis.DynamicallyAccessedMembers(System.Diagnostics.CodeAnalysis.DynamicallyAccessedMemberTypes.PublicFields)]
public System.Reflection.FieldInfo[] GetFields();
public System.Reflection.FieldInfo[] GetFields();
[<System.Diagnostics.CodeAnalysis.DynamicallyAccessedMembers(System.Diagnostics.CodeAnalysis.DynamicallyAccessedMemberTypes.PublicFields)>]
member this.GetFields : unit -> System.Reflection.FieldInfo[]
member this.GetFields : unit -> System.Reflection.FieldInfo[]
abstract member GetFields : unit -> System.Reflection.FieldInfo[]
override this.GetFields : unit -> System.Reflection.FieldInfo[]
Public Function GetFields () As FieldInfo()

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

Массив FieldInfo объектов, представляющих все открытые поля, определенные для текущего Type.

–или–

Пустой массив типа FieldInfo, если открытые поля не определены для текущего Type.

Реализации

Атрибуты

Примеры

В следующем примере показано использование GetFields() метода.

using System;
using System.Reflection;
using System.ComponentModel.Design;

class FieldInfo_IsSpecialName
{
    public static void Main()
    {
        try
        {
            // Get the type handle of a specified class.
            Type myType = typeof(ViewTechnology);

            // Get the fields of the specified class.
            FieldInfo[] myField = myType.GetFields();

            Console.WriteLine("\nDisplaying fields that have SpecialName attributes:\n");
            for(int i = 0; i < myField.Length; i++)
            {
                // Determine whether or not each field is a special name.
                if(myField[i].IsSpecialName)
                {
                    Console.WriteLine("The field {0} has a SpecialName attribute.",
                        myField[i].Name);
                }
            }
        }
        catch(Exception e)
        {
            Console.WriteLine("Exception : {0} " , e.Message);
        }
    }
}
open System.ComponentModel.Design

try
    // Get the type handle of a specified class.
    let myType = typeof<ViewTechnology>

    // Get the fields of the specified class.
    let myFields = myType.GetFields()

    printfn $"\nDisplaying fields that have SpecialName attributes:\n"
    for field in myFields do
        // Determine whether or not each field is a special name.
        if field.IsSpecialName then
            printfn $"The field {field.Name} has a SpecialName attribute."
with e ->
    printfn $"Exception : {e.Message} "
Imports System.Reflection
Imports System.ComponentModel.Design

Class FieldInfo_IsSpecialName

    Public Shared Sub Main()
        Try
            ' Get the type handle of a specified class.
            Dim myType As Type = GetType(ViewTechnology)

            ' Get the fields of a specified class.
            Dim myField As FieldInfo() = myType.GetFields()

            Console.WriteLine(ControlChars.Cr + "Displaying fields that have SpecialName attributes:" + ControlChars.Cr)
            Dim i As Integer
            For i = 0 To myField.Length - 1
                ' Determine whether or not each field is a special name.
                If myField(i).IsSpecialName Then
                    Console.WriteLine("The field {0} has a SpecialName attribute.", myField(i).Name)
                End If
            Next i
        Catch e As Exception
            Console.WriteLine("Exception : {0} ", e.Message.ToString())
        End Try
    End Sub
End Class

Комментарии

В .NET 6 и более ранних версиях метод GetFields не возвращает поля в определенном порядке, например в алфавитном порядке или порядке объявления. Код не должен зависеть от порядка возврата полей, так как этот порядок зависит. Однако начиная с .NET 7 порядок детерминирован на основе порядка метаданных в сборке.

В следующей таблице показано, какие элементы базового класса возвращаются Get методами при отражении типа.

Тип участника Static Нестатическое
Конструктор Нет Нет
Поле Нет Yes. Поле всегда скрывается по имени и подписи.
Событие Неприменимо Правило системы общего типа заключается в том, что наследование следует тем же правилам, что и методы, реализующие свойство. Отражение обрабатывает свойства как скрытие по имени и сигнатуре. См. примечание 2 ниже.
Метод Нет Yes. Метод (виртуальный и не виртуальный) может быть скрыт по имени или как по имени, так и по подписи.
Вложенный тип Нет Нет
Недвижимость Неприменимо Правило системы общего типа заключается в том, что наследование следует тем же правилам, что и методы, реализующие свойство. Отражение обрабатывает свойства как скрытие по имени и сигнатуре. См. примечание 2 ниже.
  1. Скрытие по имени и сигнатуре учитывает все части подписи, включая настраиваемые модификаторы, возвращаемые типы, типы параметров, sentinels и неуправляемые соглашения о вызовах. Это двоичное сравнение.

  2. Для отражения свойства и события скрываются по имени и сигнатуре. Если у вас есть свойство с методами get и set в базовом классе, но производный класс имеет только метод get, свойство производного класса перекрывает свойство базового класса, и вы не сможете получить доступ к методу set в базовом классе.

  3. Пользовательские атрибуты не являются частью общей системы типов.

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

Если текущий Type представляет параметр типа в определении универсального типа или универсального метода, этот метод выполняет поиск общедоступных полей ограничения класса.

См. также раздел

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

GetFields(BindingFlags)

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

При переопределении в производном классе выполняет поиск полей, определенных для текущего Type, с использованием указанных ограничений привязки.

public:
 abstract cli::array <System::Reflection::FieldInfo ^> ^ GetFields(System::Reflection::BindingFlags bindingAttr);
[System.Diagnostics.CodeAnalysis.DynamicallyAccessedMembers(System.Diagnostics.CodeAnalysis.DynamicallyAccessedMemberTypes.NonPublicFields | System.Diagnostics.CodeAnalysis.DynamicallyAccessedMemberTypes.PublicFields)]
public abstract System.Reflection.FieldInfo[] GetFields(System.Reflection.BindingFlags bindingAttr);
public abstract System.Reflection.FieldInfo[] GetFields(System.Reflection.BindingFlags bindingAttr);
[<System.Diagnostics.CodeAnalysis.DynamicallyAccessedMembers(System.Diagnostics.CodeAnalysis.DynamicallyAccessedMemberTypes.NonPublicFields | System.Diagnostics.CodeAnalysis.DynamicallyAccessedMemberTypes.PublicFields)>]
abstract member GetFields : System.Reflection.BindingFlags -> System.Reflection.FieldInfo[]
abstract member GetFields : System.Reflection.BindingFlags -> System.Reflection.FieldInfo[]
Public MustOverride Function GetFields (bindingAttr As BindingFlags) As FieldInfo()

Параметры

bindingAttr
BindingFlags

Побитовое сочетание значений перечисления, указывающее, как выполняется поиск.

–или–

Default для возврата пустого массива.

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

Массив объектов, представляющих все поля, определенные для текущего FieldInfoType , соответствующего указанным ограничениям привязки.

–или–

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

Реализации

Атрибуты

Примеры

В следующем примере показано использование GetFields(BindingFlags) метода.


using System;
using System.Reflection;

class AttributesSample
{
    public void Mymethod (int int1m, out string str2m, ref string str3m)
    {
        str2m = "in Mymethod";
    }

    public static int Main(string[] args)
    {
        Console.WriteLine ("Reflection.MethodBase.Attributes Sample");

        // Get the type.
        Type MyType = Type.GetType("AttributesSample");

        // Get the method Mymethod on the type.
        MethodBase Mymethodbase = MyType.GetMethod("Mymethod");

        // Display the method name.
        Console.WriteLine("Mymethodbase = " + Mymethodbase);

        // Get the MethodAttribute enumerated value.
        MethodAttributes Myattributes = Mymethodbase.Attributes;

        // Display the flags that are set.
        PrintAttributes(typeof(System.Reflection.MethodAttributes), (int) Myattributes);
        return 0;
    }

    public static void PrintAttributes(Type attribType, int iAttribValue)
    {
        if (!attribType.IsEnum)
        {
            Console.WriteLine("This type is not an enum.");
            return;
        }

        FieldInfo[] fields = attribType.GetFields(BindingFlags.Public | BindingFlags.Static);
        for (int i = 0; i < fields.Length; i++)
        {
            int fieldvalue = (int)fields[i].GetValue(null);
            if ((fieldvalue & iAttribValue) == fieldvalue)
            {
                Console.WriteLine(fields[i].Name);
            }
        }
    }
}
open System
open System.Reflection

type AttributesSample() =
    member _.Mymethod(int1m: int, str2m: string outref, str3m: string byref) =
        str2m <- "in Mymethod"

let printAttributes (attribType: Type) iAttribValue =
    if not attribType.IsEnum then
        printfn "This type is not an enum."
    else
        let fields = attribType.GetFields(BindingFlags.Public ||| BindingFlags.Static)
        for f in fields do
            let fieldvalue = f.GetValue null :?> int
            if fieldvalue &&& iAttribValue = fieldvalue then
                printfn $"{f.Name}"

printfn "Reflection.MethodBase.Attributes Sample"

// Get the type.
let MyType = Type.GetType "AttributesSample"

// Get the method Mymethod on the type.
let Mymethodbase = MyType.GetMethod "Mymethod"

// Display the method name.
printfn $"Mymethodbase = {Mymethodbase}"

// Get the MethodAttribute enumerated value.
let Myattributes = Mymethodbase.Attributes

// Display the flags that are set.
printAttributes typeof<MethodAttributes> (int Myattributes)
Imports System.Reflection

Class AttributesSample

    Public Sub Mymethod(ByVal int1m As Integer, ByRef str2m As String, ByRef str3m As String)
        str2m = "in Mymethod"
    End Sub

    Public Shared Function Main(ByVal args() As String) As Integer
        Console.WriteLine("Reflection.MethodBase.Attributes Sample")

        ' Get the type.
        Dim MyType As Type = Type.GetType("AttributesSample")

        ' Get the method Mymethod on the type.
        Dim Mymethodbase As MethodBase = MyType.GetMethod("Mymethod")

        ' Display the method name.
        Console.WriteLine("Mymethodbase = {0}.", Mymethodbase)

        ' Get the MethodAttribute enumerated value.
        Dim Myattributes As MethodAttributes = Mymethodbase.Attributes

        ' Display the flags that are set.
        PrintAttributes(GetType(System.Reflection.MethodAttributes), CInt(Myattributes))
        Return 0
    End Function 'Main

    Public Shared Sub PrintAttributes(ByVal attribType As Type, ByVal iAttribValue As Integer)
        If Not attribType.IsEnum Then
            Console.WriteLine("This type is not an enum.")
            Return
        End If
        Dim fields As FieldInfo() = attribType.GetFields((BindingFlags.Public Or BindingFlags.Static))
        Dim i As Integer
        For i = 0 To fields.Length - 1
            Dim fieldvalue As Integer = CType(fields(i).GetValue(Nothing), Int32)
            If (fieldvalue And iAttribValue) = fieldvalue Then
                Console.WriteLine(fields(i).Name)
            End If
        Next i
    End Sub
End Class

Комментарии

Чтобы перегрузка GetFields(BindingFlags) успешно извлекла сведения о свойстве, bindingAttr аргумент должен содержать по крайней мере один из BindingFlags.Instance и BindingFlags.Static, а также хотя бы один из BindingFlags.NonPublic них BindingFlags.Public.

Для определения полей, которые необходимо включить в поиск, можно использовать следующие BindingFlags флаги фильтра:

  • Укажите BindingFlags.Instance , чтобы включить методы экземпляра.

  • Укажите BindingFlags.Static для включения статических методов.

  • Укажите BindingFlags.Public , чтобы включить общедоступные поля в поиск.

  • Укажите BindingFlags.NonPublic , чтобы включить недоступные поля (т. е. частные, внутренние и защищенные поля) в поиск. Возвращаются только защищенные и внутренние поля в базовых классах; частные поля в базовых классах не возвращаются.

  • Укажите BindingFlags.FlattenHierarchy , чтобы включить public и protected статические элементы в иерархию; private статические элементы в унаследованных классах не включаются.

  • Укажите BindingFlags.Default только для возврата пустого PropertyInfo массива.

Для изменения работы поиска можно использовать следующие BindingFlags флаги модификатора:

  • BindingFlags.DeclaredOnly для поиска только полей, объявленных в Typeполях, которые были просто унаследованы.

См. System.Reflection.BindingFlags для получения дополнительной информации.

В .NET 6 и более ранних версиях метод GetFields не возвращает поля в определенном порядке, например в алфавитном порядке или порядке объявления. Код не должен зависеть от порядка возврата полей, так как этот порядок зависит. Однако начиная с .NET 7 порядок детерминирован на основе порядка метаданных в сборке.

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

Если текущий Type представляет параметр типа в определении универсального типа или универсального метода, этот метод выполняет поиск общедоступных полей ограничения класса.

См. также раздел

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