Sdílet prostřednictvím


System.Type – třída

Tento článek obsahuje doplňující poznámky k referenční dokumentaci pro toto rozhraní API.

Třída Type je kořenem funkce System.Reflection a je primárním způsobem přístupu k metadatům. Pomocí členů Type můžete získat informace o deklaraci typu, o členech typu (například konstruktory, metody, pole, vlastnosti a události třídy), a také modul a sestavení, ve kterém je třída nasazena.

Kód nevyžaduje žádná oprávnění k použití reflexe pro získání informací o typech a jejich členech, bez ohledu na jejich úroveň přístupu. Kód nevyžaduje žádná oprávnění k použití reflexe pro přístup k veřejným členům nebo jiným členům, jejichž úrovně přístupu by byly viditelné během normální kompilace. Aby však váš kód používal reflexi pro přístup k členům, které by normálně byly nepřístupné, jako jsou soukromé nebo interní metody, nebo chráněná pole typu, který vaše třída nedědí, váš kód musí mít ReflectionPermission. Viz aspekty zabezpečení pro reflexi.

Type je abstraktní základní třída, která umožňuje více implementací. Systém bude vždy poskytovat odvozenou třídu RuntimeType. V reflexi jsou všechny třídy začínající slovem Runtime vytvořeny pouze jednou pro každý objekt v systému a podporují operace porovnání.

Poznámka:

Ve scénářích s více vlákny nezamkejte Type objekty, aby bylo možné synchronizovat přístup k datům static. Jiný kód, nad kterým nemáte žádnou kontrolu, může také uzamknout typ třídy. To může mít za následek zablokování. Místo toho synchronizujte přístup ke statickým datům uzamčením privátního objektu static.

Poznámka:

Odvozená třída má přístup k chráněným členům základních tříd volajícího kódu. Přístup je také povolený pro členy sestavení volajícího kódu. Obecně platí, že pokud máte v kódu s časnou vazbou povolený přístup, pak máte povolený přístup i v kódu s pozdní vazbou.

Poznámka:

Rozhraní, která rozšiřují další rozhraní, nedědí metody definované v rozšířených rozhraních.

Jaké typy objekt Type představuje?

Tato třída je bezpečná pro vlákno; více vláken může souběžně číst z instance tohoto typu. Instance třídy Type může představovat libovolný z následujících typů:

  • Vyučování
  • Typy hodnot
  • Pole
  • Rozhraní
  • Výčty
  • Delegáti
  • Vytvořené obecné typy a definice obecného typu
  • Argumenty typů a parametry typů vytvořených obecných typů, definice obecného typu a definice obecných metod

Načtení objektu Type

Objekt Type přidružený k určitému typu lze získat následujícími způsoby:

  • Instance Object.GetType metoda vrátí Type objekt, který představuje typ instance. Vzhledem k tomu, že všechny spravované typy jsou odvozeny z Object, lze metodu GetType volat na instanci libovolného typu.

    Následující příklad volá metodu Object.GetType k určení běhového typu každého objektu v poli objektů.

    object[] values = { "word", true, 120, 136.34, 'a' };
    foreach (var value in values)
        Console.WriteLine($"{value} - type {value.GetType().Name}");
    
    // The example displays the following output:
    //       word - type String
    //       True - type Boolean
    //       120 - type Int32
    //       136.34 - type Double
    //       a - type Char
    
    let values: obj[] = [| "word"; true; 120; 136.34; 'a' |]
    for value in values do
       printfn $"{value} - type {value.GetType().Name}"
    
    // The example displays the following output:
    //       word - type String
    //       True - type Boolean
    //       120 - type Int32
    //       136.34 - type Double
    //       a - type Char
    
    Module Example1
       Public Sub Main()
          Dim values() As Object = { "word", True, 120, 136.34, "a"c }
          For Each value In values
             Console.WriteLine("{0} - type {1}", value, 
                               value.GetType().Name)
          Next
       End Sub
    End Module
    ' The example displays the following output:
    '       word - type String
    '       True - type Boolean
    '       120 - type Int32
    '       136.34 - type Double
    '       a - type Char
    
  • Statické Type.GetType metody vrací objekt Type, který představuje typ určený jeho plně kvalifikovaným názvem.

  • Metody Module.GetTypes, Module.GetTypea Module.FindTypes vrací Type objekty, které představují typy definované v modulu. První metodu lze použít k získání pole Type objektů pro všechny veřejné a soukromé typy definované v modulu. (Instanci Module můžete získat prostřednictvím Assembly.GetModule nebo metody Assembly.GetModules nebo prostřednictvím vlastnosti Type.Module.)

  • Objekt System.Reflection.Assembly obsahuje řadu metod pro načtení tříd definovaných v sestavení, včetně Assembly.GetType, Assembly.GetTypesa Assembly.GetExportedTypes.

  • Metoda FindInterfaces vrátí filtrovaný seznam typů rozhraní podporovaných typem.

  • Metoda GetElementType vrátí objekt Type, který představuje prvek.

  • Metody GetInterfaces a GetInterface vracejí objekty Type představující typy rozhraní podporované typem.

  • Metoda GetTypeArray vrátí pole Type objektů představujících typy určené libovolnou sadou objektů. Objekty jsou zadány pomocí pole typu Object.

  • Pro interoperabilitu modelu COM jsou k dispozici metody GetTypeFromProgID a GetTypeFromCLSID. Vrací objekt Type, který představuje typ specifikovaný ProgID nebo CLSID.

  • Metoda GetTypeFromHandle je poskytována pro interoperabilitu. Vrátí objekt Type, který představuje typ určený popisovačem třídy.

  • Operátor typeof jazyka C#, operátor typeid jazyka C++ a operátor GetType jazyka Visual Basic získá objekt Type pro typ.

  • Metoda MakeGenericType vrátí objekt Type představující vytvořený obecný typ, což je otevřený konstruovaný typ, pokud jeho ContainsGenericParameters vlastnost vrátí truea uzavřený konstruovaný typ jinak. Obecný typ lze instancovat pouze v případě, že je uzavřený.

  • Metody MakeArrayType, MakePointerTypea MakeByRefType vrací Type objekty představující pole zadaného typu, ukazatel na zadaný typ a typ referenčního parametru (ref v jazyce C#, byref v jazyce F# ByRef v jazyce Visual Basic).

Porovnání objektů typu pro rovnost

Objekt Type, který představuje typ, je jedinečný; to znamená, že dva Type odkazy na objekt odkazují na stejný objekt, pokud a pouze pokud představují stejný typ. To umožňuje porovnání objektů Type pomocí referenční rovnosti. Následující příklad porovnává Type objekty, které představují počet celočíselné hodnoty k určení, zda jsou stejného typu.

long number1 = 1635429;
int number2 = 16203;
double number3 = 1639.41;
long number4 = 193685412;

// Get the type of number1.
Type t = number1.GetType();

// Compare types of all objects with number1.
Console.WriteLine($"Type of number1 and number2 are equal: {Object.ReferenceEquals(t, number2.GetType())}");
Console.WriteLine($"Type of number1 and number3 are equal: {Object.ReferenceEquals(t, number3.GetType())}");
Console.WriteLine($"Type of number1 and number4 are equal: {Object.ReferenceEquals(t, number4.GetType())}");

// The example displays the following output:
//       Type of number1 and number2 are equal: False
//       Type of number1 and number3 are equal: False
//       Type of number1 and number4 are equal: True
let number1 = 1635429L
let number2 = 16203
let number3 = 1639.41
let number4 = 193685412L

// Get the type of number1.
let t = number1.GetType()

// Compare types of all objects with number1.
printfn $"Type of number1 and number2 are equal: {Object.ReferenceEquals(t, number2.GetType())}"
printfn $"Type of number1 and number3 are equal: {Object.ReferenceEquals(t, number3.GetType())}"
printfn $"Type of number1 and number4 are equal: {Object.ReferenceEquals(t, number4.GetType())}"

// The example displays the following output:
//       Type of number1 and number2 are equal: False
//       Type of number1 and number3 are equal: False
//       Type of number1 and number4 are equal: True
Module Example
   Public Sub Main()
      Dim number1 As Long = 1635429
      Dim number2 As Integer = 16203
      Dim number3 As Double = 1639.41
      Dim number4 As Long = 193685412
      
      ' Get the type of number1.
      Dim t As Type = number1.GetType()
      
      ' Compare types of all objects with number1.
      Console.WriteLine("Type of number1 and number2 are equal: {0}",
                        Object.ReferenceEquals(t, number2.GetType()))
      Console.WriteLine("Type of number1 and number3 are equal: {0}",
                        Object.ReferenceEquals(t, number3.GetType()))
      Console.WriteLine("Type of number1 and number4 are equal: {0}",
                        Object.ReferenceEquals(t, number4.GetType()))
   End Sub
End Module
' The example displays the following output:
'       Type of number1 and number2 are equal: False
'       Type of number1 and number3 are equal: False
'       Type of number1 and number4 are equal: True