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


Type.GetMembers Метод

Определение

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

Перегрузки

GetMembers(BindingFlags)

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

GetMembers()

Возвращает все открытые члены текущего объекта Type.

GetMembers(BindingFlags)

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

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

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

Параметры

bindingAttr
BindingFlags

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

-или-

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

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

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

-или-

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

Реализации

Примеры

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

ref class MyClass
{
public:
   int * myInt;
   String^ myString;
   MyClass(){}

   void Myfunction(){}

};

int main()
{
   try
   {
      MyClass^ MyObject = gcnew MyClass;
      array<MemberInfo^>^myMemberInfo;
      
      // Get the type of the class 'MyClass'.
      Type^ myType = MyObject->GetType();
      
      // Get the public instance members of the class 'MyClass'.
      myMemberInfo = myType->GetMembers( static_cast<BindingFlags>(BindingFlags::Public | BindingFlags::Instance) );
      Console::WriteLine( "\nThe public instance members of class '{0}' are : \n", myType );
      for ( int i = 0; i < myMemberInfo->Length; i++ )
      {
         
         // Display name and type of the member of 'MyClass'.
         Console::WriteLine( "'{0}' is a {1}", myMemberInfo[ i ]->Name, myMemberInfo[ i ]->MemberType );

      }
   }
   catch ( SecurityException^ e ) 
   {
      Console::WriteLine( "SecurityException : {0}", e->Message );
   }


      //Output:
      //The public instance members of class 'MyClass' are :

      //'Myfunction' is a Method
      //'ToString' is a Method
      //'Equals' is a Method
      //'GetHashCode' is a Method
      //'GetType' is a Method
      //'.ctor' is a Constructor
      //'myInt' is a Field
      //'myString' is a Field

}

class MyClass
{
   public int myInt = 0;
   public string myString = null;

   public MyClass()
   {
   }
   public void Myfunction()
   {
   }
}

class Type_GetMembers_BindingFlags
{
   public static void Main()
   {
      try
      {
         MyClass MyObject = new MyClass();
         MemberInfo [] myMemberInfo;

         // Get the type of the class 'MyClass'.
         Type myType = MyObject.GetType();

         // Get the public instance members of the class 'MyClass'.
         myMemberInfo = myType.GetMembers(BindingFlags.Public|BindingFlags.Instance);

         Console.WriteLine( "\nThe public instance members of class '{0}' are : \n", myType);
         for (int i =0 ; i < myMemberInfo.Length ; i++)
         {
            // Display name and type of the member of 'MyClass'.
            Console.WriteLine( "'{0}' is a {1}", myMemberInfo[i].Name, myMemberInfo[i].MemberType);
         }
      }
      catch (SecurityException e)
      {
         Console.WriteLine("SecurityException : " + e.Message );
      }

      //Output:
      //The public instance members of class 'MyClass' are :

      //'Myfunction' is a Method
      //'ToString' is a Method
      //'Equals' is a Method
      //'GetHashCode' is a Method
      //'GetType' is a Method
      //'.ctor' is a Constructor
      //'myInt' is a Field
      //'myString' is a Field
   }
}
open System.Reflection
open System.Security

type MyClass =
    val public myInt: int
    val public myString: string

    new () = { myInt = 0; myString = null}

    member _.MyMethod() = ()

try
    let MyObject = MyClass()

    // Get the type of the class 'MyClass'.
    let myType = MyObject.GetType()

    // Get the public instance members of the class 'MyClass'.
    let myMemberInfo = myType.GetMembers(BindingFlags.Public ||| BindingFlags.Instance)

    printfn $"\nThe public instance members of class '{myType}' are : \n"
    for i = 0 to myMemberInfo.Length - 1 do
        // Display name and type of the member of 'MyClass'.
        printfn $"'{myMemberInfo[i].Name}' is a {myMemberInfo[i].MemberType}"
with :? SecurityException as e ->
    printfn $"SecurityException : {e.Message}"

//Output:
//The public instance members of class 'MyClass' are :

//'Myfunction' is a Method
//'ToString' is a Method
//'Equals' is a Method
//'GetHashCode' is a Method
//'GetType' is a Method
//'.ctor' is a Constructor
//'myInt' is a Field
//'myString' is a Field
Class [MyClass]
   Public myInt As Integer = 0
   Public myString As String = Nothing
   
   
   Public Sub New()
   End Sub
   
   Public Sub Myfunction()
   End Sub
End Class

Class Type_GetMembers_BindingFlags
   
   Public Shared Sub Main()
      Try
         Dim MyObject As New [MyClass]()
         Dim myMemberInfo() As MemberInfo
         
         ' Get the type of the class 'MyClass'.
         Dim myType As Type = MyObject.GetType()
         
         ' Get the public instance members of the class 'MyClass'. 
         myMemberInfo = myType.GetMembers((BindingFlags.Public Or BindingFlags.Instance))
         
         Console.WriteLine(ControlChars.Cr + "The public instance members of class '{0}' are : " + ControlChars.Cr, myType)
         Dim i As Integer
         For i = 0 To myMemberInfo.Length - 1
            ' Display name and type of the member of 'MyClass'.
            Console.WriteLine("'{0}' is a {1}", myMemberInfo(i).Name, myMemberInfo(i).MemberType)
         Next i
      
      Catch e As SecurityException
         Console.WriteLine(("SecurityException : " + e.Message.ToString()))
      End Try


      'Output:
      'The public instance members of class 'MyClass' are :

      ''Myfunction' is a Method
      ''ToString' is a Method
      ''Equals' is a Method
      ''GetHashCode' is a Method
      ''GetType' is a Method
      ''.ctor' is a Constructor
      ''myInt' is a Field
      ''myString' is a Field


   End Sub
End Class

Комментарии

Члены включают свойства, методы, конструкторы, поля, события и вложенные типы.

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

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 и более ранних версиях GetMembers метод не возвращает элементы в определенном порядке, например в алфавитном порядке или порядке объявления. Код не должен зависеть от порядка, в котором возвращаются члены, так как этот порядок отличается. Однако, начиная с .NET 7, порядок детерминирован на основе порядка метаданных в сборке.

Чтобы получить инициализатор класса (статический конструктор) с помощью этой перегрузки метода, необходимо указать BindingFlags.Static | BindingFlags.NonPublic (BindingFlags.StaticOrBindingFlags.NonPublic в Visual Basic). Вы также можете получить инициализатор класса с помощью TypeInitializer свойства .

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

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

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

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

GetMembers()

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

Возвращает все открытые члены текущего объекта Type.

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

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

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

-или-

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

Реализации

Примеры

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

ref class MyClass
{
public:
   int myInt;
   String^ myString;
   MyClass(){}

   void Myfunction(){}

};

int main()
{
   try
   {
      MyClass^ myObject = gcnew MyClass;
      array<MemberInfo^>^myMemberInfo;
      
      // Get the type of 'MyClass'.
      Type^ myType = myObject->GetType();
      
      // Get the information related to all public members of 'MyClass'.
      myMemberInfo = myType->GetMembers();
      Console::WriteLine( "\nThe members of class '{0}' are :\n", myType );
      for ( int i = 0; i < myMemberInfo->Length; i++ )
      {
         
         // Display name and type of the concerned member.
         Console::WriteLine( "'{0}' is a {1}", myMemberInfo[ i ]->Name, myMemberInfo[ i ]->MemberType );

      }
   }
   catch ( SecurityException^ e ) 
   {
      Console::WriteLine( "Exception : {0}", e->Message );
   }

}
class MyClass
{
   public int myInt = 0;
   public string myString = null;

   public MyClass()
   {
   }
   public void Myfunction()
   {
   }
}

class Type_GetMembers
{
   public static void Main()
   {
      try
      {
         MyClass myObject = new MyClass();
         MemberInfo[] myMemberInfo;

         // Get the type of 'MyClass'.
         Type myType = myObject.GetType();

         // Get the information related to all public member's of 'MyClass'.
         myMemberInfo = myType.GetMembers();

         Console.WriteLine( "\nThe members of class '{0}' are :\n", myType);
         for (int i =0 ; i < myMemberInfo.Length ; i++)
         {
            // Display name and type of the concerned member.
            Console.WriteLine( "'{0}' is a {1}", myMemberInfo[i].Name, myMemberInfo[i].MemberType);
         }
      }
      catch(SecurityException e)
      {
         Console.WriteLine("Exception : " + e.Message );
      }
   }
}
type MyClass =
    val public myInt: int
    val public myString: string

    new () = { myInt = 0; myString = null}

    member _.MyMethod() = ()

try
    let myObject = MyClass()

    // Get the type of 'MyClass'.
    let myType = myObject.GetType()

    // Get the information related to all public member's of 'MyClass'.
    let myMemberInfo = myType.GetMembers()

    printfn $"\nThe members of class '{myType}' are :\n"
    for i = 0 to myMemberInfo.Length - 1 do
    // Display name and type of the concerned member.
        printfn $"'{myMemberInfo[i].Name}' is a {myMemberInfo[i].MemberType}"
with e ->
    printfn $"Exception : {e.Message}"
Class [MyClass]
   Public myInt As Integer = 0
   Public myString As String = Nothing
   
   
   Public Sub New()
   End Sub
   
   Public Sub Myfunction()
   End Sub
End Class

Class Type_GetMembers
   
   Public Shared Sub Main()
      Try
         Dim myObject As New [MyClass]()
         Dim myMemberInfo() As MemberInfo
         
         ' Get the type of 'MyClass'.
         Dim myType As Type = myObject.GetType()
         
         ' Get the information related to all public member's of 'MyClass'. 
         myMemberInfo = myType.GetMembers()
         
         Console.WriteLine(ControlChars.Cr + "The members of class '{0}' are :" + ControlChars.Cr, myType)
         Dim i As Integer
         For i = 0 To myMemberInfo.Length - 1
            ' Display name and type of the concerned member.
            Console.WriteLine("'{0}' is a {1}", myMemberInfo(i).Name, myMemberInfo(i).MemberType)
         Next i

      Catch e As SecurityException
         Console.WriteLine(("Exception : " + e.Message.ToString()))
      End Try
   End Sub
End Class

Комментарии

Члены включают свойства, методы, конструкторы, поля, события и вложенные типы.

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

Эта перегрузка метода вызывает перегрузку GetMembers(BindingFlags) метода с BindingFlags.PublicBindingFlags.Static | | BindingFlags.Instance(BindingFlags.PublicOrBindingFlags.InstanceOrBindingFlags.Static в Visual Basic). Он не будет находить инициализаторы класса (статические конструкторы). Чтобы найти инициализаторы класса, вызовите перегрузку GetMembers(BindingFlags) и укажите | BindingFlags.NonPublicBindingFlags.Static(BindingFlags.StaticOrBindingFlags.NonPublic в Visual Basic). Вы также можете получить инициализатор класса с помощью TypeInitializer свойства .

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

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

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

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

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

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

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

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