Megosztás a következőn keresztül:


Attribútumok

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.