Programmering

Sådan arbejder du med attributter i C #

Attributter er en stærk funktion i C # programmeringssprog, der kan tilføje metadataoplysninger til dine samlinger.

En attribut er faktisk et objekt, der er forbundet med et af disse elementer: Assembly, Class, Method, Delegate, Enum, Event, Field, Interface, Property og Struct. De kan bruges til at knytte deklarative oplysninger - du kan hente sådanne oplysninger ved kørsel på et senere tidspunkt, hvis det er nødvendigt at bruge refleksion. Med andre ord kan du bruge attributter til at indsprøjte yderligere information til samlingerne, der kan spørges ved kørsel, hvis det er nødvendigt ved hjælp af refleksion. En attribut består af dets navn og eventuelt en liste over parametre. Attributnavnet svarer til attributklassen.

Du kan drage fordel af attributter til at validere forretningsobjekterne i din applikation. Der er to typer attributter - iboende attributter og brugerdefinerede attributter. Mens førstnævnte er tilgængelig som en del af .Net-rammen, kan sidstnævnte implementeres ved at aflede en klasse fra System.Attribute-klassen. MSDN siger: "En attribut er et stykke yderligere deklarativ information, der er specificeret til en erklæring."

Lad os nu komme ind på en kode. Attributten Forældet kan bruges til at betegne en metode som forældet - en, der ikke længere skal bruges, da den ikke længere er nødvendig eller måske har et andet alternativ. Følgende kodestykke illustrerer, hvordan du kan bruge attributten Forældet oven på en metodedeklaration.

[Forældet ("Denne metode er forældet ...")]

offentlig statisk ugyldighed DoSomeWork ()

        {

// Noget kode

        }

Hvis du bruger denne metode i din kode og kompilerer dit program, vises en advarsel i outputvinduet i Visual Studio IDE. Så du kan ignorere denne advarsel, hvis du vil. Hvad nu hvis du vil have, at dine udviklere overhovedet ikke skal bruge denne metode? Nå kan du derefter bruge den anden parameter (den er dog valgfri), mens du erklærer attributten Forældet. Her er den ændrede version af DoSomeWork () -metoden. Bemærk brugen af ​​den boolske parameter denne gang.

[Forældet ("Denne metode er forældet ...", sandt)]

offentlig statisk ugyldighed DoSomeWork ()

        {

// Noget kode

        }                                                                                                                        

Når du sender "sand" som den anden valgfri parameter denne gang og kompilerer dit program, ville koden slet ikke kompilere. Det var det, du ville gøre, ikke?

Brugerdefinerede attributter

I dette afsnit vil vi undersøge, hvordan vi kan implementere brugerdefinerede attributter. Brugerdefinerede attributter er klasser, der arver System.Attribute-klassen. Så for at implementere en brugerdefineret attributklasse skal du oprette en ny klasse og udlede den fra System.Attribute-klassen som vist nedenfor.

ved hjælp af System;

offentlig klasse CustomAttribute: Attribut

{

}

For at kontrollere brugen af ​​brugerdefinerede attributter kan du drage fordel af klassen AttributeUsage. Denne klasse indeholder egenskaber som ValidOn, AllowMultiple og Inherited, som kan bruges til at kontrollere brugen af ​​din brugerdefinerede attribut.

Følgende kodestykke illustrerer en ændret version af vores tilpassede attributklasse. Bemærk brugen af ​​en konstruktør, der accepterer en streng som et argument og tildeler den til klassens private strengmedlem. Dette er kun til illustration.

[AttributeUsage (AttributeTargets.All)]

offentlig klasse CustomAttribute: Attribut

    {

privat strengtekst;

offentlig CustomAttribute (strengtekst)

        {

this.Text = tekst;

        }

offentlig streng Tekst

        {

            {

returner denne.tekst;

            }

sæt

            {

this.text = værdi;

            }

        }

    }

Du kan også angive de attributmål, som din tilpassede attribut skal anvendes på. Sådan kan du gøre det.

[AttributeUsage (AttributeTargets.Class |

AttributeTargets.Constructor |

AttributTargets.Field |

AttributTargets.Method |

AttributeTargets. Ejendom,

AllowMultiple = true)]

    offentlig klasse CustomAttribute: Attribut

    {

privat strengtekst;

offentlig CustomAttribute (strengtekst)

        {

this.Text = tekst;

        }

offentlig streng Tekst

        {

            {

returner denne.tekst;

            }

sæt

            {

this.text = værdi;

            }

        }

    }

Du kan nu bruge refleksion til at vise alle attributter, der anvendes på et bestemt objekt ved hjælp af følgende kodestykke.

MemberInfo memberInfo = typeof (CustomAttribute);

objekt [] attributter = memberInfo.GetCustomAttributter (sand);

for (int i = 0, j = attributter. længde; i <j; i ++)

  {

Console.WriteLine (attributter [i]);

  }

Overvej nu følgende klasse, som vi vil anvende vores brugerdefinerede attribut på.

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

offentlig klasse SomeClass

{

}

Bemærk, hvordan den brugerdefinerede attribut er blevet brugt, og en tekst sendes som argument til den. Følgende kodestykke illustrerer, hvordan du kan udskrive indholdet af egenskaben Tekst.

MemberInfo memberInfo = typeof (SomeClass);

objekt [] attributter = memberInfo.GetCustomAttributter (sand);

foreach (objektattribut i attributter)

{

CustomAttribute customAttribute = attribut som CustomAttribute;

hvis (customAttribute! = null)

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

andet

Console.WriteLine ();

}