Dela via


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:

Mer information finns i: