Megjegyzés
Az oldalhoz való hozzáféréshez engedély szükséges. Megpróbálhat bejelentkezni vagy módosítani a címtárat.
Az oldalhoz való hozzáféréshez engedély szükséges. Megpróbálhatja módosítani a címtárat.
Az attribútumok hatékony módszert nyújtanak metaadatok vagy deklaratív információk kóddal (szerelvények, típusok, metódusok, tulajdonságok stb.) való társítására. Miután hozzárendelt egy attribútumot egy programentitáshoz, futtatáskor lekérdezheti az attribútumot egy tükröződésinevű technikával.
Az attribútumok a következő tulajdonságokkal rendelkeznek:
- Az attribútumok metaadatokat adnak a programhoz. metaadatok a programban definiált típusokkal kapcsolatos információk. Minden .NET-szerelvény tartalmaz egy megadott metaadatkészletet, amely leírja a szerelvényben definiált típusokat és típustagokat. Az egyéb szükséges információk megadásához egyéni attribútumokat is hozzáadhat.
- Az attribútumok teljes szerelvényekre, modulokra vagy kisebb programelemekre, például osztályokra és tulajdonságokra alkalmazhatók.
- Az attribútumok ugyanúgy fogadhatják el az argumentumokat, mint a metódusokat és a tulajdonságokat.
- Az attribútumok lehetővé teszik, hogy a program tükrözés segítségével vizsgálja meg a saját metaadatait vagy metaadatait más programokban.
Tükröződésekkel végzett munka
API-k ismertetik a szerelvényeket, a modulokat és a típusokat. A tükröződés használatával dinamikusan hozhat létre egy típuspéldányt, összekapcsolhatja a típust egy meglévő objektummal, vagy lekérheti a típust egy meglévő objektumból, és meghívhatja annak metódusait, vagy hozzáférhet a mezőihez és tulajdonságaihoz. Ha attribútumokat használ a kódban, a tükröződés lehetővé teszi azok elérését. További információ: Attribútumok.
Íme egy egyszerű példa a GetType() metódussal való tükröződésre. A Object
alaposztály minden típusa örökli ezt a metódust, amely egy változó típusának lekérésére szolgál:
Jegyzet
Ügyeljen arra, hogy a C# (using System;
) kódfájl tetején adja hozzá a using System.Reflection;
és utasításokat.
// Using GetType to obtain type information:
int i = 42;
Type type = i.GetType();
Console.WriteLine(type);
A kimenet a következő típust jeleníti meg:
System.Int32
Az alábbi példa reflexió használatával szerzi be a betöltött szerelvény teljes nevét.
// Using Reflection to get information of an Assembly:
Assembly info = typeof(int).Assembly;
Console.WriteLine(info);
A kimenet a következő példához hasonló:
System.Private.CoreLib, Version=7.0.0.0, Culture=neutral, PublicKeyToken=7cec85d7bea7798e
Az IL kulcsszóeltérései
A C#-kulcsszavak protected
és internal
nem rendelkeznek jelentéssel a köztes nyelven (IL), és nem használják a tükröződési API-kban. Az IL megfelelő kifejezései Családi és Közgyűlés. Az alábbi módokon használhatja ezeket a kifejezéseket:
- Ha tükrözés használatával szeretne azonosítani egy
internal
metódust, használja a IsAssembly tulajdonságot. - A
protected internal
metódus azonosításához használja a IsFamilyOrAssembly-et.
Attribútumokkal való munka
Az attribútumok szinte bármilyen deklarációra elhelyezhetők, bár egy adott attribútum korlátozhatja az érvényes deklarációk típusait. A C#-ban egy attribútumot úgy adhat meg, hogy az attribútum nevét szögletes zárójelek ([]
) közé helyezi annak az entitásnak a deklarációja fölé, amelyre vonatkozik.
Ebben a példában a SerializableAttribute attribútummal egy adott jellemzőt alkalmazhat egy osztályra:
[Serializable]
public class SampleClass
{
// Objects of this type can be serialized.
}
Az DllImportAttribute attribútummal deklarálhat egy metódust:
[System.Runtime.InteropServices.DllImport("user32.dll")]
extern static void SampleMethod();
Több attribútumot is elhelyezhet egy deklarációban:
void MethodA([In][Out] ref double x) { }
void MethodB([Out][In] ref double x) { }
void MethodC([In, Out] ref double x) { }
Egyes attribútumok egy adott entitáshoz többször is megadhatóak. Az alábbi példa a ConditionalAttribute attribútum többszörös használatára mutat be:
[Conditional("DEBUG"), Conditional("TEST1")]
void TraceMethod()
{
// ...
}
Jegyzet
Konvenció szerint az attribútumnevek az "Attribútum" utótaggal végződnek, hogy megkülönböztessék őket a .NET-kódtárak más típusaitól. Azonban nem kell megadnia az attribútum utótagját, ha attribútumokat használ a kódban. Egy [DllImport]
deklaráció például egyenértékű egy [DllImportAttribute]
deklarációval, de DllImportAttribute
a .NET osztálytárban lévő osztály tényleges neve.
Attribútumparaméterek
Számos attribútum rendelkezik paraméterekkel, amelyek lehetnek pozíciós, névtelenvagy . Az alábbi táblázat az elnevezett és a pozicionális attribútumokkal való munkát ismerteti.
Pozícióparaméterek
Az attribútumkonstruktor paraméterei:
elnevezett paraméterek
Az attribútum tulajdonságai vagy mezői:
- Meg kell adni, nem lehet kihagyni
- Mindig adja meg az elsőt
- Adja meg bizonyos sorrendet
- Mindig nem kötelező, hagyja ki, ha hamis
- A helymeghatározó paraméterek után adja meg
- Bármilyen sorrendben megadva
A következő kód például három egyenértékű DllImport
attribútumot jelenít meg:
[DllImport("user32.dll")]
[DllImport("user32.dll", SetLastError=false, ExactSpelling=false)]
[DllImport("user32.dll", ExactSpelling=false, SetLastError=false)]
Az első paraméter, a DLL neve pozíciós, és mindig az első. A többi példány megnevezett paraméter. Ebben a forgatókönyvben mindkét elnevezett paraméter alapértelmezés szerint hamis, ezért kihagyhatók. Az alapértelmezett paraméterértékekkel kapcsolatos információkért tekintse meg az egyes attribútumok dokumentációját. Az engedélyezett paramétertípusokról további információt a C# nyelvi specifikációjánakAttribútumok szakaszában talál.
Attribútumcélok
Az attribútum cél az az entitás, amelyre az attribútum vonatkozik. Egy attribútum például alkalmazható egy osztályra, metódusra vagy szerelvényre. Alapértelmezés szerint az attribútum az azt követő elemre vonatkozik. De explicit módon is azonosíthatja a társítandó elemet, például egy metódust, egy paramétert vagy a visszatérési értéket.
Az attribútum-cél explicit azonosításához használja az alábbi szintaxist:
[target : attribute-list]
Az alábbi táblázat a lehetséges target
értékek listáját mutatja.
Célérték | A következőkre vonatkozik: |
---|---|
assembly |
Teljes szerelvény |
module |
Aktuális szerelvénymodul |
field |
Mező egy osztályban vagy egy szerkezetben |
event |
Esemény |
method |
Metódus vagy get és set tulajdonság-hozzáférők |
param |
Metódusparaméterek vagy set tulajdonság-kiegészítő paraméterek |
property |
Ingatlan |
return |
Metódus, tulajdonságindexelő vagy get tulajdonság tartozékának visszaadott értéke |
type |
Struktúra, osztály, interfész, felsorolás vagy delegált |
Megadhatja a field
célértéket, amely attribútumot alkalmaz a automatikusan implementált tulajdonságlétrehozott háttérmezőre.
Az alábbi példa bemutatja, hogyan alkalmazhat attribútumokat szerelvényekre és modulokra. További információ: Common attributes (C#).
using System;
using System.Reflection;
[assembly: AssemblyTitleAttribute("Production assembly 4")]
[module: CLSCompliant(true)]
Az alábbi példa bemutatja, hogyan alkalmazhatók attribútumok a metódusokra, metódusparaméterekre és metódus-visszatérési értékekre a C#-ban.
// 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; }
Jegyzet
Függetlenül attól, hogy a ValidatedContract
attribútum érvényesnek van-e definiálva, a return
célértéket akkor is meg kell adni, ha a ValidatedContract
attribútum csak az értékek visszaadására vonatkozik. Más szóval a fordító nem használja a AttributeUsage
információkat a nem egyértelmű attribútumcélok feloldásához. További információ: AttributeUsage.
Az attribútumok használatának módjainak áttekintése
Íme néhány gyakori módszer az attribútumok kódban való használatára:
- Jelölje meg a POST-üzenetekre reagáló vezérlőmetszeteket a
HttpPost
attribútum használatával. További információ: HttpPostAttribute osztály. - A metódusparaméterek natív kóddal való üzemeltetéskor történő alkalmazásának ismertetése. További információ: MarshalAsAttribute osztály.
- Írja le a komponensobjektum-modell (COM) tulajdonságait osztályokhoz, metódusokhoz és felületekhez.
- Hívja meg a nem felügyelt kódot a DllImportAttribute osztály használatával.
- Írja le a szerelvényt a cím, a verzió, a leírás vagy a védjegy szempontjából.
- Az osztály azon tagjainak leírása, amelyeket szerializálni kell az adatmegőrzéshez.
- Az osztálytagok és az XML-csomópontok közötti megfeleltetés leírása AZ XML-szerializáláshoz.
- A módszerek biztonsági követelményeinek ismertetése.
- Adja meg a biztonság kikényszerítéséhez használt jellemzőket.
- Az optimalizálásokat az igény szerinti (JIT) fordítóval vezérelheti, így a kód könnyen hibakereshető marad.
- Szerezzen információt egy metódus hívójáról.
Tükröződési forgatókönyvek áttekintése
A tükröződés a következő helyzetekben hasznos:
- Hozzáférési attribútumok a program metaadataiban. További információ: Attribútumokban tárolt adatok beolvasása.
- Típusok vizsgálata és példányosítása egy összeállításban.
- Új típusok létrehozása futásidőben a System.Reflection.Emit névtérben lévő osztályok használatával.
- Késői kötési és hozzáférési módszerek végrehajtása a futtatáskor létrehozott típusokon. További információ: Atípusok dinamikus betöltése és használata.