Sdílet prostřednictvím


Atributy

Atributy poskytují účinný způsob, jak přidružit metadata nebo deklarativní informace ke kódu (sestavení, typy, metody, vlastnosti atd.). Po přidružení atributu k entitě v programu můžete na atribut za běhu dotazovat pomocí techniky zvané 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 pro zadání dalších požadovaných informací.
  • Atributy lze použít na celá sestavení, moduly nebo menší prvky programu, jako jsou třídy a vlastnosti.
  • Atributy mohou přijímat argumenty stejným způsobem jako metody a vlastnosti.
  • Atributy umožňují programu zkoumat vlastní metadata nebo metadata v jiných programech pomocí reflexe.

Práce s reflexí

Rozhraní API pro reflexi poskytovaná Type 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. Když 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 s metodou GetType(). Všechny typy z Object základní třídy dědí tuto metodu, která se používá k získání typu proměnné:

Poznámka

Nezapomeňte přidat příkazy using System; a using System.Reflection; v horní části souboru kódu jazyka C# (.cs).

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

Výstup zobrazuje typ:

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 se podobá následujícímu příkladu:

System.Private.CoreLib, Version=7.0.0.0, Culture=neutral, PublicKeyToken=7cec85d7bea7798e

Rozdíly klíčových slov pro IL

Klíčová slova jazyka C# protected a internal nemají žádný význam v rozhraních IL (Intermediate Language) a nepoužívají se v rozhraních API reflexe. Odpovídající termíny v IL jsou rodina a sestava. Tady je několik způsobů, jak můžete použít tyto termíny:

  • K identifikaci internal metody pomocí reflexe použijte vlastnost IsAssembly.
  • K identifikaci protected internal metody použijte IsFamilyOrAssembly.

Práce s atributy

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 použijete atribut SerializableAttribute k použití konkrétní charakteristiky třídy:

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

Metodu můžete deklarovat pomocí atributu DllImportAttribute:

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

Do deklarace můžete umístit více atributů:

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. Následující příklad ukazuje více využití atributu ConditionalAttribute:

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

Poznámka

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

Parametry atributu

Mnoho atributů má parametry, které můžou být poziční, nepojmenovanénebo pojmenované. Následující tabulka popisuje, jak pracovat s pojmenovanými a pozičními atributy:

poziční parametry

Parametry konstruktoru atributu:

Pojmenované parametry

Vlastnosti nebo pole atributu:

  • Je nutné zadat, nelze vynechat
  • Vždy uvést jako první
  • Zadejte v určitém pořadí
  • Vždy volitelné, vynechat, pokud je to nepravda.
  • Zadání po pozičních parametrech
  • Zadání v libovolném pořadí

Následující kód například ukazuje tři ekvivalentní atributy DllImport:

[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í instance jsou pojmenované parametry. V tomto scénáři oba pojmenované parametry mají výchozí hodnotu false, aby je bylo možné vynechat. 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, metodu nebo sestavení. Ve výchozím nastavení se atribut vztahuje na prvek, který ho následuje. Můžete ale také explicitně identifikovat prvek, který chcete přidružit, například metodu, parametr nebo návratovou hodnotu.

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

[target : attribute-list]

Následující tabulka uvádí seznam možných target hodnot.

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

Můžete zadat cílovou hodnotu field k aplikování atributu na záložní pole, které je vytvořeno automaticky pro vlastnost implementovanou automaticky.

Následující příklad ukazuje, jak aplikovat atributy pro sestavení a moduly. Další informace najdete v části Obvyklé 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, pro které je atribut ValidatedContract definován jako platný, je nutné zadat return cíl, i když je atribut ValidatedContract definován tak, aby platil pouze pro návratové hodnoty. Jinými slovy kompilátor nepoužívá AttributeUsage informace k řešení nejednoznačných cílů atributů. Další informace naleznete v tématu AtributUsage.

Kontrola způsobů použití atributů

Tady je několik běžných způsobů použití atributů v kódu:

  • Označte metody kontroleru, které reagují na zprávy POST pomocí atributu HttpPost. Další informace najdete ve třídě HttpPostAttribute.
  • Popisuje, jak připravit parametry metody v rámci spolupráce s nativním kódem. Další informace najdete ve třídě MarshalAsAttribute.
  • Popis vlastností modelu COM (Component Object Model) pro třídy, metody a rozhraní
  • Volejte nespravovaný kód pomocí třídy DllImportAttribute.
  • Popište své sestavení z hlediska názvu, verze, popisu nebo ochranné známky.
  • Popsat, které členy třídy serializovat pro uchovávání.
  • Popište, jak mapovat mezi členy třídy a uzly XML pro XML serializaci.
  • Popište požadavky na zabezpečení pro metody.
  • Zadejte charakteristiky používané k vynucení zabezpečení.
  • Řiďte optimalizace pomocí kompilátoru JIT (Just-In-Time), aby kód zůstal snadno laditelný.
  • Získejte informace o volajícím metodě.

Přezkoumání scénářů reflexe

Reflexe je užitečná v následujících scénářích: