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 System.Reflection funkce 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 modul a sestavení, ve kterém je třída nasazena.

Kód nevyžaduje žádná oprávnění k získání informací o typech a jejich členech bez ohledu na jejich úrovně 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 ke členům, které by normálně byly nepřístupné, například 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 Reflexe ion.

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 neblokujte Type objekty, aby bylo možné synchronizovat přístup k static datům. 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 static objektu.

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. 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 Type třídy může představovat libovolný z následujících typů:

  • Třídy
  • 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:

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

    Následující příklad volá metodu Object.GetType k určení typu modulu runtime každého objektu v poli objektu.

    object[] values = { "word", true, 120, 136.34, 'a' };
    foreach (var value in values)
        Console.WriteLine("{0} - type {1}", value,
                          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í Type objekt, který představuje typ určený jeho plně kvalifikovaným názvem.

  • , Module.GetTypesModule.GetTypea Module.FindTypes metody 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 můžete získat Module prostřednictvím Assembly.GetModule metody nebo Assembly.GetModulesType.Module vlastnosti.)

  • 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í Type objekt, který představuje prvek.

  • Metody GetInterfacesGetInterface vrací Type objekty představující typy rozhraní podporované typem.

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

  • GetTypeFromCLSID Pro GetTypeFromProgID interoperabilitu modelu COM jsou k dispozici tyto metody. Vrátí Type objekt, který představuje typ určený znakem nebo ProgIDCLSID.

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

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

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

  • , MakeArrayTypeMakePointerTypea MakeByRefType metody vracejí Type objekty, které představují 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, pouze pokud představují stejný typ. To umožňuje porovnání Type objektů pomocí rovnosti odkazů. 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: {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()));

// 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