Информационный сайт

 

Реклама
bulletinsite.net -> Книги на сайте -> Программисту -> Троелсен Э. -> "С# и платформа .NET. Библиотека программиста" -> 140

С# и платформа .NET. Библиотека программиста - Троелсен Э.

Троелсен Э. С# и платформа .NET. Библиотека программиста — СПб.: Питер, 2004. — 796 c.
ISBN 5-318-00750-3
Скачать (прямая ссылка): cplatforma2004.pdf
Предыдущая << 1 .. 134 135 136 137 138 139 < 140 > 141 142 143 144 145 146 .. 320 >> Следующая

// Этот класс kmc будет сохранять на диске
[Serializable]
public class Motorcycle
'(
bool hasRadioSystem; bool hasHeadSet; bool nasSissySsr:
// Однако при этом незачея утружден себя сохранение* этого поля [NonSerialized]
float weightOfCurrentPassengerS:
}
При помощи ILDasm .exe можно убедиться, что эти атрибуты присутствуют в определении класса (рис. 7.9).
Если нам потребуется применить к одному и тому же типу сразу несколько атрибутов, в нашем распоряжении два варианта — либо перечислить их через запятую внутри одних квадратных скобок, либо разместить их каждый в своей паре скобок друг над другом. Однако сейчас нас не интересует, кто будет использовать наши атрибуты, мы сосредоточимся надругой проблеме: как создать свой собствен -ный, пользовательский атрибут.
одного базового класса -y;'ci.Attri В этом .NKTсильно расходится с СОМ, в котором атрибуты — не более чем наборы символов.
Работа с существующими атрибутами
Атрибуты С# (как и атрибуты СОМ) - это аннотации, которые могут быть применены к типу (классу, интерфейсу, структуре и т. п.), члену (свойству, методу и т. д.), сборке или модулю. В разных пространствах имен .'NLT определено множество готовых к использованию атрибутов. Многие из них предназначены для организации взаимодействия COM/.NET, отладки и других «экзотических» аспектов создания приложений ,NET. Несколько встроенных атрибутов .NET представлены в табл. 7.5.
336 Глава 7 Рефлексия типов и программирование с использованием атрибутов
2ES2SE:
К class public auto anrf seriaiizauie fc>tore(ieldini1
-v hasHeadSet: private ЬоФЧ-""*
- V hasRadloSystem : private bool : і V hasSissyBar: private bool • v WBiflhiOlCurrentPas; engers . ptr<sle notserialiied f!oat32
.ver 1:0:454:30853
Рис. 7.9. Атрибуты предстаален Зі метаданными
Создание пользовательских атрибутов
С# (как и другие .NET-совместимые языки) позволяет создавать пользовательские атрибуты. Как мы уже говорили, все атрибуты в ,NET — это классы, производные от System.Attribute. Когда мы применяем атрибут [Serial іzable] к классу Motorcycle, мы на самом деле применяем объект класса System. Serializable. Реально атрибут — это объект, который может быть применен к другим типам. В объектно-ориентированном программировании для описания этого подхода существует даже специальный термин — программирование, ориентированное на атрибуты (atribute-oriented programming).
Если наша цель - создать новый пользовательский атрибут, первое, что мы должны сделать - создать новый класс, производный от System.Attribute. По общепринятому соглашению об именовании имя этого класса должно оканчиваться на - Attribute. Вот пример простого атрибута, который можно будет использовать для хранения в метаданных типа текстового описания автомобиля:
// Пользовательский атрибут
public class VehicleuescMptionAttribute : System.Attribute
;
private string description:
public string Desc
:
get { return description: ] set . description - value; }
1
public
{ description = desc; }
public VehicleDescriptionAttribute(){}
Наш класс VehicleDescriptionAttribute содержит закрытую строковую переменную description, свойство Desc и перегруженный конструктор. Теперь мы можем применить этот класс к классу для автомобиля. Синтаксис, которому необходимо следовать при использовании атрибута, определяется имеющимися конструкторами атрибута:
Создание пользовательских атрибутов 337
// Применение пользовательского атрибута
[VehicleDescriptionAttributeC'A very long, slow but feature rich auto")]
publiCclass Winnebago
{
public Winnebago(){} // Всякие члены класса
}
Теперь посмотрим, что получилось в результате. Как мы видим, строковое зна ¦
чение, передаваемое атрибуту, заключается в круглые скобки. Естественно, в определении атрибута должен существовать конструктор, который сможет принять это передаваемое значение. Теперь при помощи ILDasm.exe можно найти строковое сообщение в метаданных типов (рис. 7.10 и 7.11). Обратите внимание, что в коде IL пользовательские атрибуты помечаются ключевым словом custom.
/ Wiriiiphdiju::.(.l<»s public auto
-Зі
6F 6E 67 2C 20
61 74 75 72 65 00 )
// . . 'A vary long, • s/ Slav but feature // rich auto..
Рис. 7.10. Ваше строковое сообщение можно найти в коде IL
-ІДІ *|
' w>un..iiai!'.i::-< lass public auto л™ і«м*тіі<-міп«
,clas-p-jblic auto ansi befoffsfiildlnifc Winnebago extends [n»corlib]Systero.Object
.cntcai instance void Cviatemfct*, Y*hi«ie»e»cr iytionlt'.
// end of сікзя Wiun-sbagc
Рис. 7.11. Внутреннее представление пользовательского атрибута
Если наш пользовательский атрибут, как и положено по соглашению об именовании, заканчивается на суффикс -Atribute, этот суффикс можно опустить:
// Это сработает только тогда, если имя вашего пользовательского атрибута -// VehicleDescriptiQuAtribute
[VeMcleDescription ("A very long, slow but feature rich auto")]
public class Winnebago
public Winnebago(}{)
// Всякие члены классе
338 Глава 7 • Рефлексия типов и программирование с использованием атрибутов
Предыдущая << 1 .. 134 135 136 137 138 139 < 140 > 141 142 143 144 145 146 .. 320 >> Следующая
Реклама
Авторские права © 2009 AdsNet. Все права защищены.
Rambler's Top100