|
Программирование >> Обработка исключительных ситуаций
Листинг 12.3 (продолжение) PropertyInfo[] prs = t.GetPropertiesO; foreach ( PropertyInfo p in prs ) Console.WriteLineC p ); Console.WriteLineC); static void MainO { Type t = typeof( Spirit ); InfoC t ); t = typeof( Monster ): InfoC t ); t = typeof( Daemon ); InfoC t ); Результат работы программы: ======= Класс MonsterLib.Spirit абстрактн1й базов1й класс System.Object Void PassportO Int32 GetHashCodeO Boolean Equals(System.Object) System.String ToStringO System.Type Get TypeО ======= Класс MonsterLib.Monster базов1й класс MonsterLib.Spirit Void PassportO Int32 GetHashCodeO Boolean Equals(System.Object) System.String ToStringO Int32 get Health() Void set Health(Int32) Int32 get Ammo() Void set Ammo(Int32) System.String get Name() System.Type GetType() Int32 Health Int32 A>nmo System.String Name Атрибуты Атрибуты - это дополнительные сведения об элементах программы (классах, методах, параметрах и т. д.). С помощью атрибутов можно добавлять информацию в ме-таданн1е сборки и затем извлекать ее во время выполнения программы. Атрибут является специальным видом класса и происходит от базового класса System. Attribute. Атрибуты делятся на стандартные и пользовательские. В библиотеке .NET предусмотрено множество стандартных атрибутов, которые можно использовать в программах. Если всего разнообразия стандартн1х атрибутов не хватит, чтобы удовлетворить прихотливые требования программиста, он может описать собственные классы атрибутов, после чего применять их точно так же, как стандартные. При использовании (спецификации) атрибутов они задаются в секции атрибутов, располагаемой непосредственно перед элементом, для описания которого они предназначены. Секция заключается в квадратные скобки и может содержать несколько атрибутов, перечисляемых через запятую. Порядок следования атрибутов произвольный. Для каждого атрибута задаются имя, а также необязательные параметры и тип элемента сборки, к которому относится атрибут. Простейший пример атрибута: [Serializable] class Monster ======= Класс MonsterLib.Daemon базов1й класс MonsterLib.Monster Void PassportO Int32 GetHashCodeO Boolean Equals(System.Object) System.String ToStringO Void Think О Int32 getJealthO Void set Health(Int32) Int32 get AmmoO Void set Ammo(Int32) System.String get Name() System.Type GetTypeO Int32 Health Int32 nmo System.String Name Можно продолжить исследования дальше, например, получить параметры и возвращаемое значение каждого метода. Думаю, что принцип вам уже ясен. Напомню, что вся эта информация берется из метаданных сборки.
Пусть, например, перед методом описан гипотетический атрибут ABC: [ABC] public void Do() { ... } По умолчанию он относится к методу. Чтобы указать, что атрибут относится не к методу, а к его возвращаемому значению, следует написать: [return:ABC] public void Do() { ... } Атрибут может иметь параметры. Они записываются в круглых скобках через запятую после имени атрибута и бывают позиционными и именованными. Именованный параметр указывается в форме ия = значение, для позиционного просто задается значение. Например, для использованного в следующем фрагменте кода атрибута CLSCompliant задан позиционный параметр true. Атрибуты, [NonSerialized] string name; int health, ammo; Атрибут [Serializable] , означающий, что объекты этого класса можно сохранять во внешней памяти, относится ко всему классу Monster. При этом поле name помечено атрибутом [NonSerialized], что говорит о том, что это поле сохраняться не должно. Сохранение объектов рассматривалось в главе 10. Обычно из контекста понятно, к какому элементу сборки относится атрибут, однако в некоторых случаях могут возникнуть неоднозначности. Для их устранения перед именем атрибута записывается тип элемента сборки - уточняющее ключевое слово, отделяемое от атрибута двоеточием. Ключевые слова и соответствующие элементы сборки, к которым могут относиться атрибуты, перечислены в табл. 12.3. Таблица 12.3. Типы элемента сборки, задаваемые для атрибутов
|
© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки. |