Poznámka
Přístup k této stránce vyžaduje autorizaci. Můžete se zkusit přihlásit nebo změnit adresáře.
Přístup k této stránce vyžaduje autorizaci. Můžete zkusit změnit adresáře.
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:
- Přístupové atributy v metadatech programu Další informace naleznete v tématu Načítání informací uložených v atributech.
- Prozkoumejte a vytvořte instanci typů v sestavení.
- Sestavte nové typy za běhu programu pomocí tříd v prostoru názvů System.Reflection.Emit.
- U typů vytvořených za běhu proveďte pozdní vazby a metody přístupu. Další informace naleznete v tématu Dynamické načítání a používání typů.