reklama

Magické [Attribute] v .NET

Čo znamená magicke slovo [Attribute] pred definíciou triedy, alebo vlastnosti objektu? Kedy a ako používaľ atribúty, ako si vytvoriť vlastné atribúty v C#.

Písmo: A- | A+
Diskusia  (0)

Tento článok je písaný hlavne pre .NET verzie 1.1 v jazyku C#.

Načo slúžia atribúty v .NET.

Atribúty slúžia ako tzv. dodatočné popisné informácie(metadata) v danej triede, popripade fieldu/property a.i. členov .NET objektu.

Zápis:

public class MyCustomControl

{

[DescriptionAttribute("Toto je nazov komponenty.")]

public string Name;

}
V tomto kóde som si vytvoril triedu MyCustomControl, ktorá ma field Name. K fieldu Name som pridal metadata popis pomocou atributu DescriptionAttribute .

Atribút DescritionAttribute sa využíva napríklad pri vytváraní vlastných custom controls do Windows /Web aplikácii. Designer Windows / Web aplikácií pozná atribút DescriptionAttribute a vie, že obsahuje popis k danému fieldu/property a tento popis potom zobrazí v Property okne designera.

Další dobrý príklad je nasledovný:

SkryťVypnúť reklamu
Článok pokračuje pod video reklamou

[Flags]

public enum DrawOptions

{

DrawLines = 1,

DrawBorders = 2,

DrawBackground = 4,

DrawPictures = 8

}
Attribút [Flags] v tomto pripade určuje, že daný výpočtový typ DrawOptions pracuje v režime tzv. bitovej masky. Výpočtový typ funguje v režime bitovej masky aj bez atribútu [Flags], avšak ak je tento atribút uvedený, tak .NET vie o tom, že daný výpočtový typ pracuje v režime bitovej masky. To je nápomocné aj pri použití konštrukcie .ToString() .

Napríklad:

DrawOptions options = DrawOptions.DrawLines | DrawOptions.DrawBackground;

Console.WriteLine(options);
Tento príklad vypíše na obrazovku tento text: DrawLines, DrawBackground. Ak by nebol uvedený atribút [Flags] zobrazilo by sa iba číslo 5.

Vytvorenie a využitie vlastných atribútov.

Ako príklad môžeme použiť podporu exportovania pre objekty.
Vytvoríme si atribút [ExportAttribute] , ktorý bude určovať čo sa má exportovať z ľubovolného objektu.

Definícia atribútu

SkryťVypnúť reklamu
reklama

[AttributeUsage(AttributeTargets.Field)]

public class ExportAttribute: Attribute

{

public string Description;

public ExportAttribute(string description)

{

this.Description = description;

}

}
Vysvetlenie kódu:

  • Aj pri vytváraní vlastných atribútov sa používajú atribúty .NET frameworku :-)

  • Atribút [AttributeUsage] určuje pre akú oblasť sa dá použiť náš atribút, v našom prípade je to pre fieldy: AttributeTargets.Field

  • Trieda musí dediť od základnej triedy pre atribúty - Attribute

  • Ďalej má naša trieda jednu vlastnosť a to Description, v ktorej si budeme uchovávať dodatočný popis pre export fieldu

Toto je celá definícia nášho atribútu.

Práca s novým atribútom

Dalšou dôležitou časťou je samotné pracovanie s novým atribútom.
Atribúty sa môžu zapisovať pred definíciou triedy(napr. [AttributeUsage] pri našej triede [ExportAttribute] ), ale aj pred definíciou fieldu(aj na iný miestach).

Vytvoríme si dalšiu triedu, ktorá bude obsahovať 3 fieldy, z toho iba 2 budú označené atribútom [ExportAttribute] pre export.

Definícia triedy UserInfo :

SkryťVypnúť reklamu
reklama

public class UserInfo

{

[ExportAttribute("Name of user")]

public string Name;

[ExportAttribute("Surname of user")]

public string Surname;

public int Age;

public UserInfo(string name, string surname, int age)

{

this.Name = name;

this.Surname = surname;

this.Age = age;

}

}
Vysvetlenie kódu:

  • Vlastnosti Name a Surname sú označené atribútom [ExportAttribute], ktorý určuje že dané vlastnosti z triedy UserInfo sú exportovateľné

  • Vlastnosť Age nie je označené atribútom [ExportAttribute] čo znamená, že táto vlastnosť nepodporuje export

Vyhľadávanie atribútov

Máme už definovaný nový atribúť [ExportAttribute] a máme tento atribút aj použitý v triede UserInfo.
Teraz je dôležité vedieť načo toto všetko bolo dobré.Potrebujeme vedieť ako vyhľadať náš atribút v ľubovoľnom objekte.
Na to použijeme Reflection , ktorý slúží na získavanie informácií o typoch objektov v .NET

Zápis:

Type type = obj.GetType();

SkryťVypnúť reklamu
reklama

FieldInfo[] fields = type.GetFields(BindingFlags.GetField | BindingFlags.Public | BindingFlags.Instance);
Vysvetlenie kódu:

  • Najskôr si zistíme typ objektu obj a to metódou GetType()

  • Z typu objektu zistíme zoznam fieldov, ktoré obsahuje daný typ a to metódou GetFields

Pokračovanie zápisu:

foreach (FieldInfo field in fields)

{

object[] attributes = field.GetCustomAttributes(typeof(ExportAttribute), false);

if (attributes.Length > )

{

ExportAttribute expAttr = attributes[] as ExportAttribute;

string fieldDescription = expAttr.Description;

object fieldValue = field.GetValue(obj);

}

}
Vysvetlenie kódu:

  • Prechádzame zoznamom fieldov, ktoré sme získali pomocou Reflections

  • Zoznam atribútov pre daný field zistíme pomocou metódy GetCustomAttributes

  • Do metódy GetCustomAttributes zadáme typ nášho atribútu pomocou konštrukcie typeof(ExportAttribute) aby sme získali iba atribúty typu ExportAttribute

  • Premenná attributes obsahuje zoznam atribútov, ktoré sú priradené fieldu, ak je počet atribútov vačší ako 0, znamená to že daný field je označený atribútom ExportAttribute

  • Následne pretypujeme prvý prvok poľa attribtues na objekt typu ExportAttribute, aby sme mohli pracovať s touto konkrétnou triedou

A na záver ešte jedna zaujímavosť, a to že .NET framework podporuje zápis tried atribútov aj bez uvedenia koncového slova Attribute.
Napríklad:

[ExportAttribute("Name of user")]

public string Name;
Môžeme zapísať aj takto:

[Export("Name of user")]

public string Name;
Download kódu: http://www.freewebs.com/terrorix/files/blog/Attributes.zip

Peter Šulek

Peter Šulek

Bloger 
  • Počet článkov:  2
  •  | 
  • Páči sa:  0x

Som programátor, ktorý momentálne programuje .NET aplikácie v jayzku C#. Žijem v malom meste na západe na slovenska - v bratislave. Zoznam autorových rubrík:  .NETSúkromnéNezaradené

Prémioví blogeri

Pavol Koprda

Pavol Koprda

10 článkov
Iveta Rall

Iveta Rall

87 článkov
Martina Hilbertová

Martina Hilbertová

49 článkov
Post Bellum SK

Post Bellum SK

74 článkov
Jiří Ščobák

Jiří Ščobák

752 článkov
reklama
reklama
SkryťZatvoriť reklamu