Использование атрибутов для нормализации и валидации бизнес-сущностей - Применение класса атрибутов
ОГЛАВЛЕНИЕ
Страница 4 из 6
Что можно сделать с этим атрибутом? Применить к свойству! Давайте добавим псевдонимы к нескольким свойствам и напишем метод, который с помощью отражения получает список всех свойств объекта 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