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.StaticOr
BindingFlags.NonPublic в Visual Basic). Вы также можете получить инициализатор класса с помощью TypeInitializer свойства .
Если текущий Type представляет сконструированный универсальный тип, этот метод возвращает MemberInfo объекты с параметрами типа, замененными соответствующими аргументами типа.
Если текущий Type объект представляет параметр типа в определении универсального типа или универсального метода, этот метод выполняет поиск членов ограничения класса или членов Object , если ограничение класса отсутствует.
См. также раздел
- MemberInfo
- BindingFlags
- DefaultBinder
- GetMember(String)
- GetDefaultMembers()
- FindMembers(MemberTypes, BindingFlags, MemberFilter, 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.PublicOr
BindingFlags.InstanceOr
BindingFlags.Static в Visual Basic). Он не будет находить инициализаторы класса (статические конструкторы). Чтобы найти инициализаторы класса, вызовите перегрузку GetMembers(BindingFlags) и укажите | BindingFlags.NonPublicBindingFlags.Static(BindingFlags.StaticOr
BindingFlags.NonPublic в Visual Basic). Вы также можете получить инициализатор класса с помощью TypeInitializer свойства .
В следующей таблице показано, какие члены базового класса возвращаются методами Get
при отражении в типе.
Тип члена | Статические | Нестатическое |
---|---|---|
Конструктор | Нет | Нет |
Поле | Нет | Да. Поле всегда имеет значение hide-by-name-and-signature. |
Событие | Неприменимо | Общее правило системы типов состоит в том, что наследование совпадает с наследованием методов, реализующих свойство . Отражение рассматривает свойства как скрытие по имени и сигнатуре. См. примечание 2 ниже. |
Метод | Нет | Да. Метод (как виртуальный, так и не виртуальный) может иметь значение hide-by-name или hide-by-name-and-signature. |
Вложенный тип | Нет | Нет |
Свойство. | Неприменимо | Общее правило системы типов состоит в том, что наследование совпадает с наследованием методов, реализующих свойство . Отражение рассматривает свойства как скрытие по имени и сигнатуре. См. примечание 2 ниже. |
Функция скрытия по имени и подписи учитывает все части сигнатуры, включая пользовательские модификаторы, типы возвращаемых значений, типы параметров, sentinels и неуправляемые соглашения о вызовах. Это двоичное сравнение.
Для отражения свойства и события представляют собой скрытие по имени и сигнатуре. Если у вас есть свойство с методом доступа get и set в базовом классе, но производный класс имеет только метод доступа get, свойство производного класса скрывает свойство базового класса, и вы не сможете получить доступ к методу задания в базовом классе.
Настраиваемые атрибуты не являются частью системы общих типов.
Если текущий Type представляет сконструированный универсальный тип, этот метод возвращает MemberInfo объекты с параметрами типа, замененными соответствующими аргументами типа.
Если текущий Type объект представляет параметр типа в определении универсального типа или универсального метода, этот метод выполняет поиск членов ограничения класса или членов Object , если ограничение класса отсутствует.
См. также раздел
- MemberInfo
- GetMember(String)
- GetDefaultMembers()
- FindMembers(MemberTypes, BindingFlags, MemberFilter, Object)