Поделиться через


Type.GetMethods Метод

Определение

Возвращает методы текущего объекта Type.

Перегрузки

GetMethods(BindingFlags)

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

GetMethods()

Возвращает все открытые методы текущего объекта Type.

GetMethods(BindingFlags)

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

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

public:
 abstract cli::array <System::Reflection::MethodInfo ^> ^ GetMethods(System::Reflection::BindingFlags bindingAttr);
public abstract System.Reflection.MethodInfo[] GetMethods (System.Reflection.BindingFlags bindingAttr);
abstract member GetMethods : System.Reflection.BindingFlags -> System.Reflection.MethodInfo[]
Public MustOverride Function GetMethods (bindingAttr As BindingFlags) As MethodInfo()

Параметры

bindingAttr
BindingFlags

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

-или-

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

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

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

-или-

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

Реализации

Примеры

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

using namespace System;
using namespace System::Reflection;
using namespace System::Reflection::Emit;

// Create a class having two public methods and one protected method.
public ref class MyTypeClass
{
public:
   void MyMethods(){}

   int MyMethods1()
   {
      return 3;
   }


protected:
   String^ MyMethods2()
   {
      return "hello";
   }
};

void DisplayMethodInfo( array<MethodInfo^>^myArrayMethodInfo )
{
   // Display information for all methods.
   for ( int i = 0; i < myArrayMethodInfo->Length; i++ )
   {
      MethodInfo^ myMethodInfo = dynamic_cast<MethodInfo^>(myArrayMethodInfo[ i ]);
      Console::WriteLine( "\nThe name of the method is {0}.", myMethodInfo->Name );
   }
}

int main()
{
   Type^ myType = MyTypeClass::typeid;
   
   // Get the public methods.
   array<MethodInfo^>^myArrayMethodInfo = myType->GetMethods( static_cast<BindingFlags>(BindingFlags::Public | BindingFlags::Instance | BindingFlags::DeclaredOnly) );
   Console::WriteLine( "\nThe number of public methods is {0}->", myArrayMethodInfo->Length );
   
   // Display all the methods.
   DisplayMethodInfo( myArrayMethodInfo );
   
   // Get the nonpublic methods.
   array<MethodInfo^>^myArrayMethodInfo1 = myType->GetMethods( static_cast<BindingFlags>(BindingFlags::NonPublic | BindingFlags::Instance | BindingFlags::DeclaredOnly) );
   Console::WriteLine( "\nThe number of protected methods is {0}->", myArrayMethodInfo1->Length );
   
   // Display information for all methods.
   DisplayMethodInfo( myArrayMethodInfo1 );
}
using System;
using System.Reflection;
using System.Reflection.Emit;

// Create a class having two public methods and one protected method.
public class MyTypeClass
{
    public void MyMethods()
    {
    }
    public int MyMethods1()
    {
        return 3;
    }
    protected String MyMethods2()
    {
        return "hello";
    }
}
public class TypeMain
{
    public static void Main()
    {
        Type myType =(typeof(MyTypeClass));
        // Get the public methods.
        MethodInfo[] myArrayMethodInfo = myType.GetMethods(BindingFlags.Public|BindingFlags.Instance|BindingFlags.DeclaredOnly);
        Console.WriteLine("\nThe number of public methods is {0}.", myArrayMethodInfo.Length);
        // Display all the methods.
        DisplayMethodInfo(myArrayMethodInfo);
        // Get the nonpublic methods.
        MethodInfo[] myArrayMethodInfo1 = myType.GetMethods(BindingFlags.NonPublic|BindingFlags.Instance|BindingFlags.DeclaredOnly);
        Console.WriteLine("\nThe number of protected methods is {0}.", myArrayMethodInfo1.Length);
        // Display information for all methods.
        DisplayMethodInfo(myArrayMethodInfo1);		
    }
    public static void DisplayMethodInfo(MethodInfo[] myArrayMethodInfo)
    {
        // Display information for all methods.
        for(int i=0;i<myArrayMethodInfo.Length;i++)
        {
            MethodInfo myMethodInfo = (MethodInfo)myArrayMethodInfo[i];
            Console.WriteLine("\nThe name of the method is {0}.", myMethodInfo.Name);
        }
    }
}

Imports System.Reflection
Imports System.Reflection.Emit

' Create a class having two public methods and one protected method.
Public Class MyTypeClass
    Public Sub MyMethods()
    End Sub
    Public Function MyMethods1() As Integer
        Return 3
    End Function 'MyMethods1
    Protected Function MyMethods2() As [String]
        Return "hello"
    End Function 'MyMethods2
End Class
Public Class TypeMain
    Public Shared Sub Main()

        Dim myType As Type = GetType(MyTypeClass)
        ' Get the public methods.
        Dim myArrayMethodInfo As MethodInfo() = myType.GetMethods((BindingFlags.Public Or BindingFlags.Instance Or BindingFlags.DeclaredOnly))
        Console.WriteLine((ControlChars.Cr + "The number of public methods is " & myArrayMethodInfo.Length.ToString() & "."))
        ' Display all the public methods.
        DisplayMethodInfo(myArrayMethodInfo)
        ' Get the nonpublic methods.
        Dim myArrayMethodInfo1 As MethodInfo() = myType.GetMethods((BindingFlags.NonPublic Or BindingFlags.Instance Or BindingFlags.DeclaredOnly))
        Console.WriteLine((ControlChars.Cr + "The number of protected methods is " & myArrayMethodInfo1.Length.ToString() & "."))
        ' Display all the nonpublic methods.
        DisplayMethodInfo(myArrayMethodInfo1)
    End Sub

    Public Shared Sub DisplayMethodInfo(ByVal myArrayMethodInfo() As MethodInfo)
        ' Display information for all methods.
        Dim i As Integer
        For i = 0 To myArrayMethodInfo.Length - 1
            Dim myMethodInfo As MethodInfo = CType(myArrayMethodInfo(i), MethodInfo)
            Console.WriteLine((ControlChars.Cr + "The name of the method is " & myMethodInfo.Name & "."))
        Next i
    End Sub
End Class

Комментарии

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

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

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

  • Укажите BindingFlags.Static , чтобы включить статические методы.

  • Укажите BindingFlags.Public , чтобы включить открытые методы в поиск.

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

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

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

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

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

Дополнительные сведения см. в разделе System.Reflection.BindingFlags.

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

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

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

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

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

GetMethods()

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

Возвращает все открытые методы текущего объекта Type.

public:
 cli::array <System::Reflection::MethodInfo ^> ^ GetMethods();
public:
 virtual cli::array <System::Reflection::MethodInfo ^> ^ GetMethods();
public System.Reflection.MethodInfo[] GetMethods ();
member this.GetMethods : unit -> System.Reflection.MethodInfo[]
abstract member GetMethods : unit -> System.Reflection.MethodInfo[]
override this.GetMethods : unit -> System.Reflection.MethodInfo[]
Public Function GetMethods () As MethodInfo()

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

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

-или-

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

Реализации

Комментарии

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

Конструкторы не включаются в массив методов, возвращаемых этим вызовом. Выполните отдельный вызов , GetConstructors() чтобы получить методы конструктора.

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

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

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

  3. Настраиваемые атрибуты не являются частью системы общих типов.

Примечание

При поиске конструкторов и методов нельзя опускать параметры. Опустить параметры можно только при вызове .

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

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

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

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