Type.GetNestedTypes Метод
Определение
Важно!
Некоторые сведения относятся к предварительной версии продукта, в которую до выпуска могут быть внесены существенные изменения. Майкрософт не предоставляет никаких гарантий, явных или подразумеваемых, относительно приведенных здесь сведений.
Возвращает типы, вложенные в текущий Type.
Перегрузки
| Имя | Описание |
|---|---|
| GetNestedTypes() |
Возвращает открытые типы, вложенные в текущий Type. |
| GetNestedTypes(BindingFlags) |
При переопределении в производном классе выполняет поиск типов, вложенных в текущий Type, с использованием указанных ограничений привязки. |
GetNestedTypes()
- Исходный код:
- Type.cs
- Исходный код:
- Type.cs
- Исходный код:
- Type.cs
- Исходный код:
- Type.cs
- Исходный код:
- Type.cs
Возвращает открытые типы, вложенные в текущий Type.
public:
cli::array <Type ^> ^ GetNestedTypes();
public:
virtual cli::array <Type ^> ^ GetNestedTypes();
[System.Diagnostics.CodeAnalysis.DynamicallyAccessedMembers(System.Diagnostics.CodeAnalysis.DynamicallyAccessedMemberTypes.PublicNestedTypes)]
public Type[] GetNestedTypes();
public Type[] GetNestedTypes();
[<System.Diagnostics.CodeAnalysis.DynamicallyAccessedMembers(System.Diagnostics.CodeAnalysis.DynamicallyAccessedMemberTypes.PublicNestedTypes)>]
member this.GetNestedTypes : unit -> Type[]
member this.GetNestedTypes : unit -> Type[]
abstract member GetNestedTypes : unit -> Type[]
override this.GetNestedTypes : unit -> Type[]
Public Function GetNestedTypes () As Type()
Возвращаемое значение
Массив Type объектов, представляющих общедоступные типы, вложенные в текущий (поиск не рекурсивный), или пустой массив типаType, если открытые типы не вложены в текущий Type .Type
Реализации
- Атрибуты
Примеры
В следующем примере определяется вложенный класс и в structMyClass, а затем получает объекты вложенных типов с помощью типа MyClass.
using System;
using System.Reflection;
public class MyClass
{
public class NestClass
{
public static int myPublicInt=0;
}
public struct NestStruct
{
public static int myPublicInt=0;
}
}
public class MyMainClass
{
public static void Main()
{
try
{
// Get the Type object corresponding to MyClass.
Type myType=typeof(MyClass);
// Get an array of nested type objects in MyClass.
Type[] nestType=myType.GetNestedTypes();
Console.WriteLine("The number of nested types is {0}.", nestType.Length);
foreach(Type t in nestType)
Console.WriteLine("Nested type is {0}.", t.ToString());
}
catch(Exception e)
{
Console.WriteLine("Error"+e.Message);
}
}
}
Imports System.Reflection
Public Class MyClass1
Public Class NestClass
Public Shared myPublicInt As Integer = 0
End Class
Public Structure NestStruct
Public myPublicInt As Integer
End Structure 'NestStruct
End Class
Public Class MyMainClass
Public Shared Sub Main()
Try
' Get the Type object corresponding to MyClass.
Dim myType As Type = GetType(MyClass1)
' Get an array of nested type objects in MyClass.
Dim nestType As Type() = myType.GetNestedTypes()
Console.WriteLine("The number of nested types is {0}.", nestType.Length)
Dim t As Type
For Each t In nestType
Console.WriteLine("Nested type is {0}.", t.ToString())
Next t
Catch e As Exception
Console.WriteLine("Error", e.Message.ToString())
End Try
End Sub
End Class
Комментарии
В .NET 6 и более ранних версиях метод GetNestedTypes не возвращает типы в определенном порядке, например в алфавитном порядке или порядке объявления. Код не должен зависеть от порядка возврата типов, так как этот порядок зависит. Однако начиная с .NET 7 порядок детерминирован на основе порядка метаданных в сборке.
Возвращаются только открытые типы, вложенные в текущий тип; поиск не рекурсивный.
В следующей таблице показано, какие элементы базового класса возвращаются Get методами при отражении типа.
| Тип участника | Static | Нестатическое |
|---|---|---|
| Конструктор | Нет | Нет |
| Поле | Нет | Yes. Поле всегда скрывается по имени и подписи. |
| Событие | Неприменимо | Правило системы общего типа заключается в том, что наследование следует тем же правилам, что и методы, реализующие свойство. Отражение обрабатывает свойства как скрытие по имени и сигнатуре. См. примечание 2 ниже. |
| Метод | Нет | Yes. Метод (виртуальный и не виртуальный) может быть скрыт по имени или как по имени, так и по подписи. |
| Вложенный тип | Нет | Нет |
| Недвижимость | Неприменимо | Правило системы общего типа заключается в том, что наследование следует тем же правилам, что и методы, реализующие свойство. Отражение обрабатывает свойства как скрытие по имени и сигнатуре. См. примечание 2 ниже. |
Скрытие по имени и сигнатуре учитывает все части подписи, включая настраиваемые модификаторы, возвращаемые типы, типы параметров, sentinels и неуправляемые соглашения о вызовах. Это двоичное сравнение.
Для отражения свойства и события скрываются по имени и сигнатуре. Если у вас есть свойство с методами get и set в базовом классе, но производный класс имеет только метод get, свойство производного класса перекрывает свойство базового класса, и вы не сможете получить доступ к методу set в базовом классе.
Пользовательские атрибуты не являются частью общей системы типов.
Если текущий Type представляет параметр типа в определении универсального типа или универсального метода, этот метод выполняет поиск вложенных типов ограничения класса.
Если вложенный тип является универсальным, этот метод возвращает определение универсального типа. Это верно, даже если заключенный универсальный тип является закрытым созданным типом.
Note
Если текущий Type представляет универсальный тип, определенный в C#, Visual Basic или C++, вложенные типы являются универсальными, даже если у них нет универсальных параметров. Это не обязательно верно для вложенных типов, определенных в динамических сборках или скомпилированных с помощьюIlasm.exe (сборщик IL).
Сведения о вложенных универсальных типах и создании вложенных универсальных типов из определений универсальных типов см. в разделе MakeGenericType.
См. также раздел
Применяется к
GetNestedTypes(BindingFlags)
- Исходный код:
- Type.cs
- Исходный код:
- Type.cs
- Исходный код:
- Type.cs
- Исходный код:
- Type.cs
- Исходный код:
- Type.cs
При переопределении в производном классе выполняет поиск типов, вложенных в текущий Type, с использованием указанных ограничений привязки.
public:
abstract cli::array <Type ^> ^ GetNestedTypes(System::Reflection::BindingFlags bindingAttr);
[System.Diagnostics.CodeAnalysis.DynamicallyAccessedMembers(System.Diagnostics.CodeAnalysis.DynamicallyAccessedMemberTypes.NonPublicNestedTypes | System.Diagnostics.CodeAnalysis.DynamicallyAccessedMemberTypes.PublicNestedTypes)]
public abstract Type[] GetNestedTypes(System.Reflection.BindingFlags bindingAttr);
public abstract Type[] GetNestedTypes(System.Reflection.BindingFlags bindingAttr);
[<System.Diagnostics.CodeAnalysis.DynamicallyAccessedMembers(System.Diagnostics.CodeAnalysis.DynamicallyAccessedMemberTypes.NonPublicNestedTypes | System.Diagnostics.CodeAnalysis.DynamicallyAccessedMemberTypes.PublicNestedTypes)>]
abstract member GetNestedTypes : System.Reflection.BindingFlags -> Type[]
abstract member GetNestedTypes : System.Reflection.BindingFlags -> Type[]
Public MustOverride Function GetNestedTypes (bindingAttr As BindingFlags) As Type()
Параметры
- bindingAttr
- BindingFlags
Побитовое сочетание значений перечисления, указывающее, как выполняется поиск.
–или–
Возвращаемое значение
Массив Type объектов, представляющих все типы, вложенные в текущий момент Type , которые соответствуют указанным ограничениям привязки (поиск не рекурсивный), или пустой массив типа Type, если вложенные типы не найдены, соответствующие ограничениям привязки.
Реализации
- Атрибуты
Примеры
В следующем примере создаются два вложенных открытых класса и два вложенных защищенных класса и отображаются сведения для классов, соответствующих указанным ограничениям привязки.
using System;
using System.Reflection;
// Create a class with 2 nested public and 2 nested protected classes.
public class MyTypeClass
{
public class Myclass1
{
}
public class Myclass2
{
}
protected class MyClass3
{
}
protected class MyClass4
{
}
}
public class TypeMain
{
public static void Main()
{
Type myType = (typeof(MyTypeClass));
// Get the public nested classes.
Type[] myTypeArray = myType.GetNestedTypes(BindingFlags.Public);
Console.WriteLine("The number of nested public classes is {0}.", myTypeArray.Length);
// Display all the public nested classes.
DisplayTypeInfo(myTypeArray);
Console.WriteLine();
// Get the nonpublic nested classes.
Type[] myTypeArray1 = myType.GetNestedTypes(BindingFlags.NonPublic|BindingFlags.Instance);
Console.WriteLine("The number of nested protected classes is {0}.", myTypeArray1.Length);
// Display all the nonpublic nested classes.
DisplayTypeInfo(myTypeArray1);
}
public static void DisplayTypeInfo(Type[] myArrayType)
{
// Display the information for all the nested classes.
foreach (var t in myArrayType)
Console.WriteLine("The name of the nested class is {0}.", t.FullName);
}
}
// The example displays the following output:
// The number of public nested classes is 2.
// The name of the nested class is MyTypeClass+Myclass1.
// The name of the nested class is MyTypeClass+Myclass2.
//
// The number of protected nested classes is 2.
// The name of the nested class is MyTypeClass+MyClass3.
// The name of the nested class is MyTypeClass+MyClass4.
Imports System.Reflection
' Create a class with three properties.
Public Class MyTypeClass
Public Class Myclass1
End Class
Public Class Myclass2
End Class
Protected Class MyClass3
End Class
Protected Class MyClass4
End Class
End Class
Public Class TypeMain
Public Shared Sub Main()
Dim myType As Type = GetType(MyTypeClass)
' Get the public nested classes.
Dim myTypeArray As Type() = myType.GetNestedTypes((BindingFlags.Public))
Console.WriteLine("The number of public nested classes is {0}.", myTypeArray.Length.ToString())
' Display all the public nested classes.
DisplayTypeInfo(myTypeArray)
Console.WriteLine()
' Get the nonpublic nested classes.
Dim myTypeArray1 As Type() = myType.GetNestedTypes((BindingFlags.NonPublic))
Console.WriteLine("The number of protected nested classes is {0}.", myTypeArray1.Length.ToString())
' Display the information for all nested classes.
DisplayTypeInfo(myTypeArray1)
End Sub
Public Shared Sub DisplayTypeInfo(ByVal myArrayType() As Type)
' Display the information for all nested classes.
For Each t In myArrayType
Console.WriteLine("The name of the nested class is {0}.", t.FullName)
Next
End Sub
End Class
' The example displays the following output:
' The number of public nested classes is 2.
' The name of the nested class is MyTypeClass+Myclass1.
' The name of the nested class is MyTypeClass+Myclass2.
'
' The number of protected nested classes is 2.
' The name of the nested class is MyTypeClass+MyClass3.
' The name of the nested class is MyTypeClass+MyClass4.
Комментарии
Поиск вложенных типов не рекурсивен.
В .NET 6 и более ранних версиях метод GetNestedTypes не возвращает типы в определенном порядке, например в алфавитном порядке или порядке объявления. Код не должен зависеть от порядка возврата типов, так как этот порядок зависит. Однако начиная с .NET 7 порядок детерминирован на основе порядка метаданных в сборке.
BindingFlags Следующие флаги фильтров можно использовать для определения вложенных типов для включения в поиск:
Необходимо указать или BindingFlags.PublicBindingFlags.NonPublic получить возврат.
Укажите BindingFlags.Public , чтобы включить в поиск общедоступные вложенные типы.
Укажите BindingFlags.NonPublic , чтобы включить в поиск недоступные вложенные типы (т. е. частные, внутренние и защищенные вложенные типы).
Этот метод возвращает только вложенные типы текущего типа. Он не выполняет поиск базовых классов текущего типа. Чтобы найти типы, вложенные в базовые классы, необходимо ходить по иерархии наследования, вызывая GetNestedTypes на каждом уровне.
BindingFlags.Instance и BindingFlags.Static игнорируются.
Вызов этого метода только флагом BindingFlags.Public или только BindingFlags.NonPublic флагом возвращает указанные вложенные типы и не требует других флагов.
См. System.Reflection.BindingFlags для получения дополнительной информации.
Если текущий Type представляет параметр типа в определении универсального типа или универсального метода, этот метод выполняет поиск вложенных типов ограничения класса.
Если вложенный тип является универсальным, этот метод возвращает определение универсального типа. Это верно, даже если заключенный универсальный тип является закрытым созданным типом.
Note
Если текущий Type представляет универсальный тип, определенный в C#, Visual Basic или C++, вложенные типы являются универсальными, даже если у них нет универсальных параметров. Это не обязательно верно для вложенных типов, определенных в динамических сборках или скомпилированных с помощьюIlasm.exe (сборщик IL).
Сведения о вложенных универсальных типах и создании вложенных универсальных типов из определений универсальных типов см. в разделе MakeGenericType.