Использование атрибутов для нормализации и валидации бизнес-сущностей
Страница 4. Применение класса атрибутов




Что можно сделать с этим атрибутом? Применить к свойству! Давайте добавим псевдонимы к нескольким свойствам и напишем метод, который с помощью отражения получает список всех свойств объекта this и выводить на консоль их названия, и если у свойства есть DisplayNameAttribute, то вместо имени свойства выводится его псевдоним.

public int ID
...

<b>[DisplayName("ФИО")]</b>
public string Name
...

public string Resume
...

<b>[DisplayName("Дополнительная информация")]</b>
public string ExtraInfo
...

public string Email
...

<b>[DisplayName("Дата Рождения")]</b>
public DateTime Birthday
...

public int Sex
...

public ArrayList Language
...


/// <summary>

/// Отображает список имен свойств

/// </summary>

public void ShowNames()
{
IDictionary result = new Hashtable();

// Получить атрибуты уровня свойств.

// Получить все свойства данного класса и поместить их в массив

PropertyInfo[] pInfo = this.GetType().GetProperties();

for (int j=0; j<pInfo.Length; j++)
{
string _fieldName = pInfo[j].Name;
Attribute dna = Attribute.GetCustomAttribute(pInfo[j], typeof(DisplayNameAttribute));
if (dna != null)
_fieldName = ((DisplayNameAttribute)dna).Name;

Console.WriteLine("- " + _fieldName);
}
}
}

/// <summary>

/// The main entry point for the application.

/// </summary>

[STAThread]
static void Main(string[] args)
{
Person p = new Person(-1);
<b>p.ShowNames();</b>
Console.ReadLine();
...
Мы получили то, что и нужно было получить, теперь у нас есть дружелюбное к пользователю название поля сущности.
А что будет, если применить этот атрибут к одному свойству несколько раз?
[DisplayName("ФИО")]
[DisplayName("Имя")]
public string Name
{
get { return m_Name;}
set { m_Name = value;}
}

Из-за того, что мы не указали явно, что разрешаем несколько экземпляров этого атрибута для одного элемента (AllowMultiple=true) мы получим ошибку при компиляции:

c:\csharp\consoleapplication1\consoleapplication1\class1.cs(56,3): error CS0579: Duplicate 'DisplayName' attribute

 
Следующая статья »