Sdílet prostřednictvím


Atributy

Atributy poskytují výkonnou metodu asociování metadat nebo deklarativních informací s kódem (sestavení, typy, metody, vlastnosti atd.). Po přidružení atributu k entitě programu lze tento atribut za běhu dotazovat pomocí techniky označované reflexe.

Atributy mají následující vlastnosti:

  • Atributy přidávají do programu metadata. metadata jsou informace o typech definovaných v programu. Všechna sestavení .NET obsahují zadanou sadu metadat, která popisují typy a členy typu definované v sestavení. Můžete přidat vlastní atributy a zadat další požadované informace.
  • U celých sestavení, modulů nebo menších prvků programu, jako jsou třídy a vlastnosti, můžete použít jeden nebo více atributů.
  • Atributy mohou přijímat argumenty stejným způsobem jako metody a vlastnosti.
  • Program může zkoumat vlastní metadata nebo metadata v jiných programech pomocí reflexe.

Reflexe poskytuje objekty (typu Type), které popisují sestavení, moduly a typy. Reflexi můžete použít k dynamickému vytvoření instance typu, vytvoření vazby typu k existujícímu objektu nebo získání typu z existujícího objektu a vyvolání jeho metod nebo přístup k jeho polím a vlastnostem. Pokud v kódu používáte atributy, reflexe vám umožní přístup k nim. Další informace najdete v části Atributy.

Tady je jednoduchý příklad reflexe pomocí metody GetType() – zděděné všemi typy ze základní třídy Object – k získání typu proměnné:

Poznámka

Nezapomeňte do horní části souboru .cs přidat using System; a using System.Reflection;.

// Using GetType to obtain type information:
int i = 42;
Type type = i.GetType();
Console.WriteLine(type);

Výstup je: System.Int32.

Následující příklad používá reflexi k získání úplného názvu načteného sestavení.

// Using Reflection to get information of an Assembly:
Assembly info = typeof(int).Assembly;
Console.WriteLine(info);

Výstup je něco jako: System.Private.CoreLib, Version=7.0.0.0, Culture=neutral, PublicKeyToken=7cec85d7bea7798e.

Poznámka

Klíčová slova jazyka C# protected a internal nemají žádný význam v jazyku IL (Intermediate Language) a nepoužívají se v rozhraních API reflexe. Odpovídající termíny v IL jsou rodina a sestava. K identifikaci internal metody pomocí reflexe použijte vlastnost IsAssembly. K identifikaci protected internal metody použijte IsFamilyOrAssembly.

Použití atributů

Atributy lze umístit na téměř jakoukoli deklaraci, i když určitý atribut může omezit typy deklarací, na kterých je platná. V jazyce C# zadáte atribut umístěním názvu atributu uzavřeného do hranatých závorek ([]) nad deklaraci entity, na kterou se vztahuje.

V tomto příkladu se atribut SerializableAttribute používá k použití konkrétní charakteristiky třídy:

[Serializable]
public class SampleClass
{
    // Objects of this type can be serialized.
}

Metoda s atributem DllImportAttribute je deklarována jako v následujícím příkladu:

[System.Runtime.InteropServices.DllImport("user32.dll")]
extern static void SampleMethod();

Do deklarace lze umístit více než jeden atribut, jak ukazuje následující příklad:

void MethodA([In][Out] ref double x) { }
void MethodB([Out][In] ref double x) { }
void MethodC([In, Out] ref double x) { }

Některé atributy lze pro danou entitu zadat více než jednou. Příkladem takového víceúčelového atributu je ConditionalAttribute:

[Conditional("DEBUG"), Conditional("TEST1")]
void TraceMethod()
{
    // ...
}

Poznámka

Podle konvence končí všechny názvy atributů slovem "Attribute", aby se odlišily od jiných položek v knihovnách .NET. Při použití atributů v kódu však nemusíte zadávat příponu atributu. Například [DllImport] je ekvivalentní [DllImportAttribute], ale DllImportAttribute je skutečný název atributu v knihovně tříd .NET.

Parametry atributu

Mnoho atributů má parametry, které můžou být poziční, nepojmenované nebo pojmenované. Všechny poziční parametry musí být zadány v určitém pořadí a nelze je vynechat. Pojmenované parametry jsou volitelné a lze je zadat v libovolném pořadí. Nejprve jsou zadány poziční parametry. Například tyto tři atributy jsou ekvivalentní:

[DllImport("user32.dll")]
[DllImport("user32.dll", SetLastError=false, ExactSpelling=false)]
[DllImport("user32.dll", ExactSpelling=false, SetLastError=false)]

První parametr, název knihovny DLL, je poziční a vždy přichází jako první; ostatní jsou pojmenováni. V tomto případě oba pojmenované parametry mají výchozí hodnotu false, aby je bylo možné vynechat. Poziční parametry odpovídají parametrům konstruktoru atributů. Pojmenované nebo volitelné parametry odpovídají vlastnostem nebo polím atributu. Informace o výchozích hodnotách parametrů najdete v dokumentaci jednotlivých atributů.

Další informace o povolených typech parametrů najdete v části Atributy specifikace jazyka jazyka C#.

Cíle atributů

Cílová atributu je entita, na kterou se atribut vztahuje. Například atribut může platit pro třídu, konkrétní metodu nebo celé sestavení. Ve výchozím nastavení se atribut vztahuje na prvek, který ho následuje. Můžete ale také explicitně identifikovat, například to, jestli se atribut použije na metodu, nebo na jeho parametr nebo na jeho návratovou hodnotu.

Pokud chcete explicitně identifikovat cíl atributu, použijte následující syntaxi:

[target : attribute-list]

Seznam možných target hodnot je uveden v následující tabulce.

Cílová hodnota Platí pro
assembly Celé sestavení
module Aktuální modul sestavení
field Pole ve třídě nebo struktuře
event Událost
method Metody nebo přístupové metody vlastnosti get a set
param Parametry metody nebo parametry přístupového objektu vlastnosti set
property Vlastnost
return Návratová hodnota metody, indexeru vlastností nebo get přístupového objektu vlastnosti
type Struktura, třída, rozhraní, výčtový typ nebo delegát

Zadáte cílovou hodnotu field, která použije atribut na podpůrné pole vytvořené pro automaticky implementovanou vlastnost .

Následující příklad ukazuje, jak aplikovat atributy pro sestavení a moduly. Další informace najdete ve Společné Atributy (C#).

using System;
using System.Reflection;
[assembly: AssemblyTitleAttribute("Production assembly 4")]
[module: CLSCompliant(true)]

Následující příklad ukazuje, jak použít atributy na metody, parametry metody a návratové hodnoty metody v jazyce C#.

// default: applies to method
[ValidatedContract]
int Method1() { return 0; }

// applies to method
[method: ValidatedContract]
int Method2() { return 0; }

// applies to parameter
int Method3([ValidatedContract] string contract) { return 0; }

// applies to return value
[return: ValidatedContract]
int Method4() { return 0; }

Poznámka

Bez ohledu na cíle, u kterých ValidatedContract je definována jako platná, je nutné zadat return cíl, i když ValidatedContract bylo definováno tak, aby platilo pouze pro návratové hodnoty. Jinými slovy kompilátor nebude používat AttributeUsage informace k řešení nejednoznačných cílů atributů. Další informace naleznete v tématu AtributUsage.

Běžné použití atributů

Následující seznam obsahuje několik běžných použití atributů v kódu:

  • Označení metod pomocí atributu WebMethod ve webových službách, které označuje, že metoda by měla být volána přes protokol SOAP. Další informace najdete v tématu WebMethodAttribute.
  • Popis postupu zařazování parametrů metody při spolupráci s nativním kódem Další informace najdete v tématu MarshalAsAttribute.
  • Popis vlastností modelu COM pro třídy, metody a rozhraní.
  • Volání nespravovaného kódu pomocí třídy DllImportAttribute
  • Popis vašeho sestavení z pohledu názvu, verze, popisu nebo ochranné známky.
  • Popis, které členy třídy serializovat pro trvalost.
  • Popis mapování mezi členy třídy a uzly XML pro serializaci XML.
  • Popis požadavků na zabezpečení pro metody
  • Určení charakteristik používaných k vynucení zabezpečení
  • Řízení optimalizací kompilátorem JIT (just-in-time), aby bylo možné kód snadno ladit.
  • Získání informací o volajícím metodě

Přehled reflexe

Reflexe je užitečná v následujících situacích:

Další informace: