Programmering

Hvordan jobbe med attributter i C #

Attributter er en kraftig funksjon i programmeringsspråket C # som kan legge til metadatainformasjon til samlingene dine.

Et attributt er faktisk et objekt som er knyttet til noen av disse elementene: Assembly, Class, Method, Delegate, Enum, Event, Field, Interface, Property and Struct. De kan brukes til å knytte deklarativ informasjon - du kan hente slik informasjon på kjøretid på et senere tidspunkt hvis det er behov for refleksjon. Med andre ord, du kan bruke attributter for å injisere tilleggsinformasjon til forsamlingene som kan spørres om kjøretiden om nødvendig ved hjelp av refleksjon. Et attributt består av navnet og eventuelt en liste over parametere. Attributtnavnet tilsvarer attributtklassen.

Du kan dra nytte av attributter for å validere forretningsobjektene i applikasjonen din. Det er to typer attributter - iboende attributter og egendefinerte attributter. Mens førstnevnte er tilgjengelig som en del av .Net-rammeverket, kan sistnevnte implementeres ved å utlede en klasse fra System.Attribute-klassen. MSDN sier: "Et attributt er et stykke tilleggsdeklarativ informasjon som er spesifisert for en erklæring."

La oss nå komme inn på noen kode. Obsolete-attributtet kan brukes til å betegne en metode som foreldet - en som ikke skal brukes lenger, da den ikke lenger er nødvendig eller kan ha et annet alternativ. Følgende kodebit illustrerer hvordan du kan bruke obsolete-attributtet på toppen av en metodedeklarasjon.

[Foreldet ("Denne metoden er foreldet ...")]

offentlig statisk tomrom DoSomeWork ()

        {

// Noe kode

        }

Hvis du bruker denne metoden i koden din og kompilerer programmet ditt, vil du se en advarsel vises i utgangsvinduet til Visual Studio IDE. Så du kan ignorere denne advarselen hvis du vil. Nå, hva om du vil at utviklerne dine ikke skal bruke denne metoden i det hele tatt? Vel, du kan deretter bruke den andre parameteren (den er valgfri skjønt) mens du erklærer attributtet Foreldet. Her er den modifiserte versjonen av DoSomeWork () -metoden. Legg merke til bruken av den boolske parameteren denne gangen.

[Foreldet ("Denne metoden er foreldet ...", sant)]

offentlig statisk tomrom DoSomeWork ()

        {

// Noe kode

        }                                                                                                                        

Når du sender "true" som den andre valgfrie parameteren denne gangen og kompilerer programmet ditt, ville ikke koden kompilert i det hele tatt. Det var det du ønsket å gjøre, ikke sant?

Egendefinerte attributter

I denne delen vil vi undersøke hvordan vi kan implementere egendefinerte attributter. Egendefinerte attributter er klasser som arver System.Attribute-klassen. Så for å implementere en tilpasset attributtklasse, opprett en ny klasse og hent den fra System.Attributtklasse som vist nedenfor.

bruker System;

offentlig klasse CustomAttribute: Attributt

{

}

For å kontrollere bruken av egendefinerte attributter, kan du dra nytte av klassen AttributeUsage. Denne klassen inneholder egenskaper som ValidOn, AllowMultiple og Inherited som kan brukes til å kontrollere bruken av det egendefinerte attributtet.

Følgende kodebit illustrerer en modifisert versjon av vår tilpassede attributtklasse. Legg merke til bruken av en konstruktør som godtar en streng som et argument og tildeler den til det private strengmedlemmet i klassen. Dette er bare for illustrasjonsformål.

[AttributeUsage (AttributeTargets.All)]

offentlig klasse CustomAttribute: Attributt

    {

privat strengtekst;

offentlig CustomAttribute (strengtekst)

        {

this.Text = tekst;

        }

offentlig streng Tekst

        {

            {

returner denne.tekst;

            }

sett

            {

this.text = verdi;

            }

        }

    }

Du kan også spesifisere attributtmålene som det egendefinerte attributtet skal brukes på. Slik kan du gjøre det.

[AttributeUsage (AttributeTargets.Class |

AttributeTargets.Constructor |

AttributeTargets.Field |

AttributeTargets.Method |

AttributeTargets.Property,

AllowMultiple = true)]

    offentlig klasse CustomAttribute: Attributt

    {

privat strengtekst;

offentlig CustomAttribute (strengtekst)

        {

this.Text = tekst;

        }

offentlig streng Tekst

        {

            {

returner denne.tekst;

            }

sett

            {

this.text = verdi;

            }

        }

    }

Du kan nå bruke refleksjon for å vise alle attributtene som brukes på et bestemt objekt ved hjelp av følgende kodebit.

MemberInfo memberInfo = typeof (CustomAttribute);

objekt [] attributter = memberInfo.GetCustomAttributes (true);

for (int i = 0, j = attributter. lengde; i <j; i ++)

  {

Console.WriteLine (attributter [i]);

  }

Vurder nå følgende klasse som vi vil bruke vårt egendefinerte attributt på.

[CustomAttribute ("Hello World ...")]

offentlig klasse SomeClass

{

}

Legg merke til hvordan det egendefinerte attributtet har blitt brukt, og en tekst sendt som argument til den. Følgende kodebit illustrerer hvordan du kan skrive ut innholdet i Tekst-egenskapen.

MemberInfo memberInfo = typeof (SomeClass);

objekt [] attributter = memberInfo.GetCustomAttributes (true);

foreach (objektattributt i attributter)

{

CustomAttribute customAttribute = attributt som CustomAttribute;

hvis (customAttribute! = null)

Console.WriteLine ("Text = {0}", customAttribute.Text);

ellers

Console.WriteLine ();

}

$config[zx-auto] not found$config[zx-overlay] not found