Герберт Шилдт - C# 4.0 полное руководство - 2011

Тут можно читать онлайн Герберт Шилдт - C# 4.0 полное руководство - 2011 - бесплатно полную версию книги (целиком) без сокращений. Жанр: Прочая старинная литература. Здесь Вы можете читать полную версию (весь текст) онлайн без регистрации и SMS на сайте лучшей интернет библиотеки ЛибКинг или прочесть краткое содержание (суть), предисловие и аннотацию. Так же сможете купить и скачать торрент в электронном формате fb2, найти и слушать аудиокнигу на русском языке или узнать сколько частей в серии и всего страниц в публикации. Читателям доступно смотреть обложку, картинки, описание и отзывы (комментарии) о произведении.

Герберт Шилдт - C# 4.0 полное руководство - 2011 краткое содержание

C# 4.0 полное руководство - 2011 - описание и краткое содержание, автор Герберт Шилдт, читайте бесплатно онлайн на сайте электронной библиотеки LibKing.Ru

C# 4.0 полное руководство - 2011 - читать онлайн бесплатно полную версию (весь текст целиком)

C# 4.0 полное руководство - 2011 - читать книгу онлайн бесплатно, автор Герберт Шилдт
Тёмная тема
Сбросить

Интервал:

Закладка:

Сделать

Получение атрибутов объекта

Как только атрибут будет присоединен к элементу, он может быть извлечен в других частях программы. Для извлечения атрибута обычно используется один из двух методов. Первый метод, GetCustomAttributes () , определяется в классе Memberlnfо и наследуется классом Туре. Он извлекает список всех атрибутов, присоединенных к элементу. Ниже приведена одна из его форм.

object[] GetCustomAttributes(bool наследование)

Если наследование имеет логическое значение true, то в список включаются атрибуты всех базовых классов, наследуемых по иерархической цепочке. В противном случае атрибуты извлекаются только из тех классов, которые определяются указанным типом.

Второй метод, GetCustomAttribute () , определяется в классе Attribute. Ниже приведена одна из его форм:

static Attribute GetCustomAttribute(Memberlnfо элемент, Туре тип_атрибута)

где элемент обозначает объект класса Member Inf о, описывающий тот элемент, для которого создаются атрибуты, тогда как тип_атрибута — требуемый атрибут. Данный метод используется в том случае, если цмя получаемого атрибута известно заранее, что зачастую и бывает. Так, если в классе UseAttrib имеется атрибут RemarkAttribute, то для получения ссылки на этот атрибут можно воспользоваться следующей последовательностью кода.

// Получить экземпляр объекта класса MemberInfо, связанного // с классом, содержащим атрибут RemarkAttribute.

Type t = typeof(UseAttrib);

// Извлечь атрибут RemarkAttribute.

Type tRemAtt = typeof(RemarkAttribute);

RemarkAttribute ra = (RemarkAttribute)

Attribute.GetCustomAttribute(t, tRemAtt);

Эта последовательность кода оказывается вполне работоспособной, поскольку класс Memberlnfo является базовым для класса Туре. Следовательно, t — это экземпляр объекта класса Memberlnfo.

Имея ссылку на атрибут, можно получить доступ к его членам. Благодаря этому информация об атрибуте становится доступной для программы, использующей элемент, к которому присоединен атрибут. Например, в следующей строке кода выводится содержимое свойства Remark.

Console.WriteLine(га.Remark);

Ниже приведена программа, в которой все изложенные выше особенности применения атрибутов демонстрируются на примере атрибута RemarkAttribute.

// Простой пример применения атрибута.

using System;

using System.Reflection;

[AttributeUsage(AttributeTargets.All)] public class RemarkAttribute : Attribute {

string pri_remark; // базовое поле свойства Remark

public RemarkAttribute(string comment) { pri_remark = comment;

}

public string Remark {

get { ,

return pri_remark;

}

}

}

[RemarkAttribute("В этом классе используется атрибут.")] class UseAttrib {

//...

}

class AttribDemo { static void Main() {

Type t = typeof(UseAttrib);

Console.Write("Атрибуты в классе " + t.Name + ": ");

object[] attribs = t.GetCustomAttributes(false); foreach(object о in attribs) {

Console .WriteLine (о).;

}

Console.Write("Примечание: ");

// Извлечь атрибут RemarkAttribute.

Type tRemAtt = typeof(RemarkAttribute);

RemarkAttribute ra = (RemarkAttribute)

Attribute.GetCustomAttribute(t, tRemAtt);

Console.WriteLine(ra.Remark);

}

}

Эта программа дает следующий результат.

Атрибуты в классе UseAttrib: RemarkAttribute Примечание: В этом классе используется атрибут.

Сравнение позиционных и именованных параметров

В предыдущем примере для инициализации атрибута RemarkAttribute его конструктору была передана символьная строка с помощью обычного синтаксиса конструктора. В этом случае параметр comment конструктора RemarkAttribute () называется позиционным. Этот термин отражает тот факт, что аргумент связан с параметром по его позиции в списке аргументов. Следовательно, первый аргумент передается первому параметру, второй аргумент — второму параметру и т.д.

Но для атрибута доступны также именованные параметры , которым можно присваивать первоначальные значения по их именам. В этом случае значение имеет имя, а не позиция параметра. '

ПРИМЕЧАНИЕ

Несмотря на то что именованные параметры атрибутов, по существу, подобны именованным аргументам методов, они все же отличаются в деталях.

Именованный параметр поддерживается открытым полем или свойством, которое должно быть нестатическим и доступным только для записи. Любое поле или свойство подобного рода может автоматически использоваться в качестве именованного параметра. Значение присваивается именованному параметру с помощью соответствующего оператора, расположенного в списке аргументов при вызове конструктора атрибута. Ниже приведена общая форма объявления атрибута, включая именованные параметры.

[attrib ( список_позиционных_параметров,

мменованный_параметр_1 = значение, именованный_параметр_2 = значение, ...)]

Первыми указываются позиционные параметры, если они существуют. Далее следуют именованные параметры с присваиваемыми значениями. Порядок следования

именованных параметров особого значения не имеет. Именованным параметрам не обязательно присваивать значение, и в этом случае используется значение, устанавливаемое по умолчанию.

Применение именованного параметра лучше всего показать на конкретном примере. Ниже приведен вариант класса RemarkAttribute, в который добавлено поле Supplement, предназначенное для хранения дополнительного примечания.

[AttributeUsage(AttributeTargets.All)] public class RemarkAttribute : Attribute {

string pri_remark; // базовое поле свойства Remark

// Это поле можно использовать в качестве именованного параметра, public string Supplement;

public RemarkAttribute(string comment) { pri_remark = comment;

Supplement = "Отсутствует";

}

public string Remark { get {

return pri_remark;

}

}

}

Как видите, поле Supplement инициализируется в конструкторе символьной строкой "Отсутствует". Другого способа присвоить ему первоначальное значение в конструкторе не существует. Но поскольку поле Supplement является открытым в классе RemarkAttribute, его можно использовать в качестве именованного параметра, как показано ниже.

Читать дальше
Тёмная тема
Сбросить

Интервал:

Закладка:

Сделать


Герберт Шилдт читать все книги автора по порядку

Герберт Шилдт - все книги автора в одном месте читать по порядку полные версии на сайте онлайн библиотеки LibKing.




C# 4.0 полное руководство - 2011 отзывы


Отзывы читателей о книге C# 4.0 полное руководство - 2011, автор: Герберт Шилдт. Читайте комментарии и мнения людей о произведении.


Понравилась книга? Поделитесь впечатлениями - оставьте Ваш отзыв или расскажите друзьям

Напишите свой комментарий
x