Attribut
Attribut ger en kraftfull metod för att associera metadata, eller deklarativ information, med kod (sammansättningar, typer, metoder, egenskaper och så vidare). När ett attribut har associerats med en programenhet kan attributet frågas efter vid körning med hjälp av en teknik som kallas reflection.
Attribut har följande egenskaper:
- Attribut lägger till metadata i ditt program. metadata är information om de typer som definierats i ett program. Alla .NET-sammansättningar innehåller en angiven uppsättning metadata som beskriver de typer och typmedlemmar som definierats i sammansättningen. Du kan lägga till anpassade attribut för att ange eventuell ytterligare information som krävs.
- Du kan använda ett eller flera attribut för hela sammansättningar, moduler eller mindre programelement, till exempel klasser och egenskaper.
- Attribut kan acceptera argument på samma sätt som metoder och egenskaper.
- Programmet kan undersöka sina egna metadata eller metadata i andra program med hjälp av reflektion.
Reflection innehåller objekt (av typen Type) som beskriver sammansättningar, moduler och typer. Du kan använda reflektion för att dynamiskt skapa en instans av en typ, binda typen till ett befintligt objekt eller hämta typen från ett befintligt objekt och anropa dess metoder eller komma åt dess fält och egenskaper. Om du använder attribut i koden kan du komma åt dem med reflection. Mer information finns i Attribut.
Här är ett enkelt exempel på reflektion med hjälp av metoden GetType() – ärvd av alla typer från Object
basklass – för att hämta typen av en variabel:
Obs
Se till att du lägger till using System;
och using System.Reflection;
överst i .cs-filen.
// Using GetType to obtain type information:
int i = 42;
Type type = i.GetType();
Console.WriteLine(type);
Utdata är: System.Int32
.
I följande exempel används reflektion för att hämta det fullständiga namnet på den inlästa sammansättningen.
// Using Reflection to get information of an Assembly:
Assembly info = typeof(int).Assembly;
Console.WriteLine(info);
Utdata liknar följande: System.Private.CoreLib, Version=7.0.0.0, Culture=neutral, PublicKeyToken=7cec85d7bea7798e
.
Notera
Nyckelorden C# protected
och internal
har inte någon betydelse i Intermediate Language (IL) och används inte i reflection-API:erna. Motsvarande termer i IL är Family och Assembly. Om du vill identifiera en internal
metod med reflektion använder du egenskapen IsAssembly. Om du vill identifiera en protected internal
-metod använder du IsFamilyOrAssembly.
Använda attribut
Attribut kan placeras på nästan vilken deklaration som helst, även om ett specifikt attribut kan begränsa de typer av deklarationer som den är giltig för. I C# anger du ett attribut genom att placera namnet på attributet inom hakparenteser ([]
) ovanför deklarationen för den entitet som det gäller för.
I det här exemplet används attributet SerializableAttribute för att tillämpa en specifik egenskap på en klass:
[Serializable]
public class SampleClass
{
// Objects of this type can be serialized.
}
En metod med attributet DllImportAttribute deklareras som följande exempel:
[System.Runtime.InteropServices.DllImport("user32.dll")]
extern static void SampleMethod();
Mer än ett attribut kan placeras i en deklaration, vilket visas i följande exempel:
void MethodA([In][Out] ref double x) { }
void MethodB([Out][In] ref double x) { }
void MethodC([In, Out] ref double x) { }
Vissa attribut kan anges mer än en gång för en viss entitet. Ett exempel på ett sådant multiuse-attribut är ConditionalAttribute:
[Conditional("DEBUG"), Conditional("TEST1")]
void TraceMethod()
{
// ...
}
Not
Enligt konventionen slutar alla attributnamn med ordet "Attribut" för att skilja dem från andra objekt i .NET-biblioteken. Du behöver dock inte ange attributsuffixet när du använder attribut i kod. Till exempel motsvarar [DllImport]
[DllImportAttribute]
, men DllImportAttribute
är attributets faktiska namn i .NET-klassbiblioteket.
Attributparametrar
Många attribut har parametrar som kan vara positionella, namnlösa eller namngivna. Eventuella positionsparametrar måste anges i en viss ordning och kan inte utelämnas. Namngivna parametrar är valfria och kan anges i valfri ordning. Positionsparametrar anges först. Dessa tre attribut är till exempel likvärdiga:
[DllImport("user32.dll")]
[DllImport("user32.dll", SetLastError=false, ExactSpelling=false)]
[DllImport("user32.dll", ExactSpelling=false, SetLastError=false)]
Den första parametern, DLL-namnet, är positionell och kommer alltid först. de andra namnges. I det här fallet är båda de namngivna parametrarna inställda på false som standard, så de kan utelämnas. Positionsparametrar motsvarar parametrarna för attributkonstruktorn. Namngivna eller valfria parametrar motsvarar antingen egenskaper eller fält för attributet. Information om standardparametervärden finns i dokumentationen för det enskilda attributet.
Mer information om tillåtna parametertyper finns i avsnittet Attribut i C#-språkspecifikationen.
Mål för attribut
målobjektet för ett attribut är den entitet som attributet gäller för. Ett attribut kan till exempel gälla för en klass, en viss metod eller en hel sammansättning. Som standard gäller ett attribut för elementet som följer det. Men du kan också uttryckligen identifiera om ett attribut tillämpas på en metod, dess parameter eller dess returvärde.
Om du uttryckligen vill identifiera ett attributmål använder du följande syntax:
[target : attribute-list]
Listan över möjliga target
värden visas i följande tabell.
Målvärde | Gäller för |
---|---|
assembly |
Hela sammansättningen |
module |
Aktuell sammansättningsmodul |
field |
Fält i en klass eller en struktur |
event |
Händelse |
method |
Metod- eller egenskapsåtkomster för get och set |
param |
Metodparametrar eller set egenskapsåtkomstparametrar |
property |
Egenskap |
return |
Returvärde för en metod, egenskapsindexerare eller get egenskapsaccessor |
type |
Struktur, klass, gränssnitt, uppräkning eller delegering |
Du anger field
målvärde för att tillämpa ett attribut på det bakgrundsfält som skapats för en automatiskt implementerad egenskap.
I följande exempel visas hur du tillämpar attribut på sammansättningar och moduler. Mer information finns i Common Attributes (C#).
using System;
using System.Reflection;
[assembly: AssemblyTitleAttribute("Production assembly 4")]
[module: CLSCompliant(true)]
I följande exempel visas hur du tillämpar attribut på metoder, metodparametrar och metodreturvärden i 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; }
Obs.
Oavsett vilka mål som ValidatedContract
har definierats som giltiga måste målet return
anges, även om ValidatedContract
har definierats för att endast gälla för returnerade värden. Kompilatorn använder med andra ord inte AttributeUsage
information för att lösa tvetydiga attributmål. Mer information finns i AttributeUsage.
Vanliga användningsområden för attribut
Följande lista innehåller några av de vanliga användningsområdena för attribut i kod:
- Märkningsmetoder som använder attributet
WebMethod
i webbtjänster för att indikera att metoden ska vara anropsbar via SOAP-protokollet. Mer information finns i WebMethodAttribute. - Beskriver hur metodparametrar hanteras när du samverkar med native kod. Mer information finns i MarshalAsAttribute.
- Beskriva COM-egenskaperna för klasser, metoder och gränssnitt.
- Anropa ohanterad kod med hjälp av klassen DllImportAttribute.
- Beskriva din sammansättning när det gäller titel, version, beskrivning eller varumärke.
- Beskriver vilka medlemmar i en klass som ska serialiseras för beständighet.
- Beskriver hur du mappar mellan klassmedlemmar och XML-noder för XML-serialisering.
- Beskriva säkerhetskrav för metoder.
- Ange egenskaper som används för att framtvinga säkerhet.
- Styrning av optimeringar av JIT-kompilatorn (just-in-time) så att koden förblir lätt att felsöka.
- Att hämta information om anroparen till en metod.
Reflektionsöversikt
Reflektion är användbart i följande situationer:
- När du måste komma åt attribut i programmets metadata. Mer information finns i Hämta information som lagras i attribut.
- För att undersöka och instansiera typer i en sammansättning.
- För att skapa nya typer vid körning. Använd klasser i System.Reflection.Emit.
- För att utföra sen bindning får du åtkomst till metoder för typer som skapas vid körning. Se artikeln Dynamisk inläsning och användning av typer.
Relaterade avsnitt
Mer information finns i: