czwartek, 20 października 2011

Atrybuty

Atrybuty czyli metadane umożliwiają umożliwiają udostępnienie dodatkowych informacji klasach, konstruktorach, delegatach, typach wyliczeniowych, zdarzeniach, polach, interfejsach, metodach, parametrach, właściwościach, zwracanych wartościach, strukturach lub innych atrybutach. Jak więc widać atrybuty można przypisać właściwie do każdego elementu który znajdziemy w platformie .NET.

Najczęstsze przykłady użycia atrybutów:
  • użycie atrybutów w WebSerwisach do oznaczenia metod które mogą być wywoływane przy użyciu protokołu Soap (np. WebMethod)
  • Oznaczenie w jaki sposób mają być reprezentowane typy dla kodu niezarządzanego
  • Opis assembly: dodanie informacji o autorze, tytule wersji, opisie
  • Oznaczenie klasy do serializacji (za pomocą atrybutu Serializable)
  • Dodawanie informacji o wymaganym poziomie uprawnień przy dostępie do metod
  • Oznaczenie metod które nie powinny być już używane - atrybut Obsolete 
Pisanie własnego atrybutu.
Napisanie własnego atrybutu jest rzeczą bardzo prostą. Przedstawię prosty sposób w jaki można taki atrybut sobie napisać a następnie jak można pobrać informacje o nim w czasie działania programu.

Klasa atrybutu:


Code:
using System;

namespace ConsoleApplication2
{
    public class FriendlyNameAttribute : Attribute
    {
        protected string _friendlyName;
        public string FriendlyName
        {
            get { return _friendlyName; }
            set { _friendlyName = value; }
        }

        protected bool _isUsed;
        public bool IsUsed
        {
            get { return _isUsed; }
            set { _isUsed = value; }
        }

        public FriendlyNameAttribute(string friendlyName)
        {
            FriendlyName = friendlyName;
        }
    }
}

Klasa wykorzystująca atrybut - Person


Code:
namespace ConsoleApplication2
{
    class Person
    {
        [FriendlyName("Imię", IsUsed = true)]
        public string FirstName { get; set; }

        [FriendlyName("Nazwisko")]
        public string LastName { get; set; }

        [FriendlyName("Rok urodzenia")]
        public int BirthYear { get; set; }
    }
}

Funkcja Main:


Code:
using System;
using System.Linq;

namespace ConsoleApplication2
{
    class Program
    {
        static void Main(string[] args)
        {
            //Get type
            var personType = typeof (Person);
            //Get propeteries
            var propertiesInfo = personType.GetProperties();
            foreach (var propertyInfo in propertiesInfo)
            {
                //Get all attributes for property
                var attributtes = propertyInfo.GetCustomAttributes(true);
                //Selecting FriendlyNameAttribute attributte
                foreach (var friendlyNameAttribute in attributtes.OfType<FriendlyNameAttribute>())
                {
                    Console.WriteLine("{0} = {1}", propertyInfo.Name, friendlyNameAttribute.FriendlyName);
                }
            }
        }
    }
}

Główne kroki programu:
  1. Stworzenie instancji klasy Type dla klasy Person
  2. Pobranie właściwości zadeklarowanych w klasie Person
  3. Przejście po kolekcji właściwości i pobranie dla każdej z nich atrybutów
  4. Instrukcją LINQ pobieramy atrybuty typu FriendlyNameAttribute 
  5. Wyświetlenie nazwy właściwości i wartości pola Name atrybutu FriendlyNameAttribute 
Efekt uruchomienia programu:


Tworzenie atrybutów jest bardzo proste. Wykorzystanie ich jest bardzo szerokie zwłaszcza w takich frameworkach jak:
  • Entity Framework
  • LINQ2SQL
  • ASP.MVC
i wielu innych w których bez skorzystania z atrybutów zmuszałoby nas do tworzenia dużo bardziej skomplikowanego kodu.

Brak komentarzy:

Prześlij komentarz