Leggere in inglese

Condividi tramite


Type.GetNestedTypes Metodo

Definizione

Ottiene i tipi annidati all'interno dell'oggetto Type corrente.

Overload

GetNestedTypes()

Restituisce i tipi pubblici annidati all'interno dell'oggetto Type corrente.

GetNestedTypes(BindingFlags)

Quando ne viene eseguito l'override in una classe derivata, cerca i tipi annidati nell'oggetto Type corrente, usando i vincoli di binding specificati.

GetNestedTypes()

Origine:
Type.cs
Origine:
Type.cs
Origine:
Type.cs

Restituisce i tipi pubblici annidati all'interno dell'oggetto Type corrente.

C#
public Type[] GetNestedTypes();

Restituisce

Type[]

Matrice di oggetti Type che rappresenta i tipi pubblici annidati nell'oggetto Type corrente (la ricerca non è ricorsiva), oppure matrice vuota di tipo Type se nessun tipo pubblico è annidato nell'oggetto Type corrente.

Implementazioni

Esempio

Nell'esempio seguente viene definita una classe annidata e un struct in MyClasse quindi vengono ottenuti oggetti dei tipi annidati usando il tipo di MyClass.

C#
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);
        }
    }
}

Commenti

In .NET 6 e versioni precedenti, il GetNestedTypes metodo non restituisce tipi in un ordine specifico, ad esempio ordine alfabetico o di dichiarazione. Il codice non deve dipendere dall'ordine in cui vengono restituiti i tipi, perché tale ordine varia. Tuttavia, a partire da .NET 7, l'ordinamento è deterministico in base all'ordinamento dei metadati nell'assembly.

Vengono restituiti solo i tipi pubblici annidati immediatamente nel tipo corrente; la ricerca non è ricorsiva.

Nella tabella seguente vengono illustrati i membri di una classe base restituiti dai Get metodi quando si riflette su un tipo.

Tipo di membro Static Non statico
Costruttore No No
Campo No Sì. Un campo è sempre hide-by-name-and-signature.
Evento Non applicabile La regola di sistema dei tipi comune è che l'ereditarietà è uguale a quella dei metodi che implementano la proprietà . La reflection considera le proprietà come hide-by-name-and-signature. Vedere la nota 2 di seguito.
Metodo No Sì. Un metodo (sia virtuale che non virtuale) può essere hide-by-name o hide-by-name-and-signature.
Tipo annidato No No
Proprietà Non applicabile La regola di sistema dei tipi comune è che l'ereditarietà è uguale a quella dei metodi che implementano la proprietà . La reflection considera le proprietà come hide-by-name-and-signature. Vedere la nota 2 di seguito.
  1. Hide-by-name-and-signature considera tutte le parti della firma, inclusi modificatori personalizzati, tipi restituiti, tipi di parametro, sentinel e convenzioni di chiamata non gestite. Si tratta di un confronto binario.

  2. Per la reflection, le proprietà e gli eventi sono hide-by-name-and-signature. Se nella classe base è presente una proprietà con una funzione di accesso get e una funzione di accesso set, ma la classe derivata ha solo una funzione di accesso get, la proprietà della classe derivata nasconde la proprietà della classe base e non sarà possibile accedere al setter nella classe base.

  3. Gli attributi personalizzati non fanno parte del sistema di tipi comuni.

Se l'oggetto corrente Type rappresenta un parametro di tipo nella definizione di un tipo generico o di un metodo generico, questo metodo cerca i tipi annidati del vincolo di classe.

Se un tipo annidato è generico, questo metodo restituisce la relativa definizione di tipo generico. Questo vale anche se il tipo generico di inclusione è un tipo costruito chiuso.

Nota

Se l'oggetto corrente Type rappresenta un tipo generico definito in C#, Visual Basic o C++, i relativi tipi annidati sono tutti generici anche se non hanno parametri generici propri. Questo non è necessariamente vero dei tipi annidati definiti negli assembly dinamici o compilati con l'Ilasm.exe assembler IL (IL Assembler).

Per informazioni sui tipi generici annidati e sulla creazione di tipi generici annidati dalle definizioni di tipo generico, vedere MakeGenericType.

Vedi anche

Si applica a

.NET 10 e altre versioni
Prodotto Versioni
.NET Core 2.0, Core 2.1, Core 2.2, Core 3.0, Core 3.1, 5, 6, 7, 8, 9, 10
.NET Framework 1.1, 2.0, 3.0, 3.5, 4.0, 4.5, 4.5.1, 4.5.2, 4.6, 4.6.1, 4.6.2, 4.7, 4.7.1, 4.7.2, 4.8, 4.8.1
.NET Standard 2.0, 2.1

GetNestedTypes(BindingFlags)

Origine:
Type.cs
Origine:
Type.cs
Origine:
Type.cs

Quando ne viene eseguito l'override in una classe derivata, cerca i tipi annidati nell'oggetto Type corrente, usando i vincoli di binding specificati.

C#
public abstract Type[] GetNestedTypes(System.Reflection.BindingFlags bindingAttr);

Parametri

bindingAttr
BindingFlags

Combinazione bit per bit di valori di enumerazione che specifica il modo in cui viene eseguita la ricerca.

-oppure-

Default per restituire null.

Restituisce

Type[]

Matrice di oggetti Type che rappresenta tutti i tipi annidati nell'oggetto Type corrente che corrispondono ai vincoli di binding specificati (la ricerca non è ricorsiva), oppure matrice vuota di tipo Type, se non viene trovato alcun tipo annidato che corrisponde ai vincoli di binding.

Implementazioni

Esempio

Nell'esempio seguente vengono create due classi pubbliche annidate e due classi protette annidate e vengono visualizzate informazioni per le classi che corrispondono ai vincoli di associazione specificati.

C#
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.

Commenti

La ricerca di tipi annidati non è ricorsiva.

In .NET 6 e versioni precedenti, il GetNestedTypes metodo non restituisce tipi in un ordine specifico, ad esempio ordine alfabetico o di dichiarazione. Il codice non deve dipendere dall'ordine in cui vengono restituiti i tipi, perché tale ordine varia. Tuttavia, a partire da .NET 7, l'ordinamento è deterministico in base all'ordinamento dei metadati nell'assembly.

I flag di filtro seguenti BindingFlags possono essere usati per definire i tipi annidati da includere nella ricerca:

Questo metodo restituisce solo i tipi annidati del tipo corrente. Non esegue ricerche nelle classi di base del tipo corrente. Per trovare i tipi annidati nelle classi di base, è necessario esaminare la gerarchia di ereditarietà, chiamando GetNestedTypes a ogni livello.

BindingFlags.Instance e BindingFlags.Static vengono ignorati.

La chiamata a questo metodo con solo il BindingFlags.Public flag o solo il BindingFlags.NonPublic flag restituirà i tipi annidati specificati e non richiede altri flag.

Per altre informazioni, vedere System.Reflection.BindingFlags.

Se l'oggetto corrente Type rappresenta un parametro di tipo nella definizione di un tipo generico o di un metodo generico, questo metodo cerca i tipi annidati del vincolo di classe.

Se un tipo annidato è generico, questo metodo restituisce la relativa definizione di tipo generico. Questo vale anche se il tipo generico di inclusione è un tipo costruito chiuso.

Nota

Se l'oggetto corrente Type rappresenta un tipo generico definito in C#, Visual Basic o C++, i relativi tipi annidati sono tutti generici anche se non hanno parametri generici propri. Questo non è necessariamente vero dei tipi annidati definiti negli assembly dinamici o compilati con l'Ilasm.exe assembler IL (IL Assembler).

Per informazioni sui tipi generici annidati e sulla creazione di tipi generici annidati dalle definizioni di tipo generico, vedere MakeGenericType.

Vedi anche

Si applica a

.NET 10 e altre versioni
Prodotto Versioni
.NET Core 2.0, Core 2.1, Core 2.2, Core 3.0, Core 3.1, 5, 6, 7, 8, 9, 10
.NET Framework 1.1, 2.0, 3.0, 3.5, 4.0, 4.5, 4.5.1, 4.5.2, 4.6, 4.6.1, 4.6.2, 4.7, 4.7.1, 4.7.2, 4.8, 4.8.1
.NET Standard 2.0, 2.1