Главная страница Случайная страница Разделы сайта АвтомобилиАстрономияБиологияГеографияДом и садДругие языкиДругоеИнформатикаИсторияКультураЛитератураЛогикаМатематикаМедицинаМеталлургияМеханикаОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРелигияРиторикаСоциологияСпортСтроительствоТехнологияТуризмФизикаФилософияФинансыХимияЧерчениеЭкологияЭкономикаЭлектроника |
💸 Как сделать бизнес проще, а карман толще?
Тот, кто работает в сфере услуг, знает — без ведения записи клиентов никуда. Мало того, что нужно видеть свое раписание, но и напоминать клиентам о визитах тоже.
Проблема в том, что средняя цена по рынку за такой сервис — 800 руб/мес или почти 15 000 руб за год. И это минимальный функционал.
Нашли самый бюджетный и оптимальный вариант: сервис VisitTime.⚡️ Для новых пользователей первый месяц бесплатно. А далее 290 руб/мес, это в 3 раза дешевле аналогов. За эту цену доступен весь функционал: напоминание о визитах, чаевые, предоплаты, общение с клиентами, переносы записей и так далее. ✅ Уйма гибких настроек, которые помогут вам зарабатывать больше и забыть про чувство «что-то мне нужно было сделать». Сомневаетесь? нажмите на текст, запустите чат-бота и убедитесь во всем сами! Определение и использование пользовательских атрибутов
Создание атрибута начинается с создания класса, реализующего атрибут. Такой класс должен быть наследуем от любого класса атрибута. Класс атрибута всегда должен иметь модификатор доступа public. Класс атрибута всегда непосредственно или опосредованно наследуется от класса System. Attribute. Объявление пользовательского атрибута начинается со встроенного атрибута AttributeUsageAttribute, который задает ключевые характеристики нового класса. Например, он определяет, может ли атрибут наследоваться другими классами, или к каким элементам он может применяться. Следующий фрагмент кода иллюстрирует применение атрибута AttributeUsageAttribute
[AttributeUsage(AttributeTargets.All, Inherited = false, AllowMultiple = true)]
Класс System. AttributeUsageAttribute содержит три члена, которые важны для создания пользовательских атрибутов. Это поля: AttributeTargets, Inherited и AllowMultiple. Поле AttributeTargets В предыдущем примере используется флаг AttributeTargets.All. Этот флаг означает, что данный атрибут может применяться к любым элементам программы. С другой стороны, можно задать флаг AttributeTargets.Class, означающий, что атрибут применяется только к классам, или AttributeTargets.Method – для методов классов и интерфейсов. Подобным образом можно применять и пользовательские атрибуты. Также можно использовать несколько экземпляров атрибута AttributeTargets. В следующем примере показано, как пользовательский атрибут может применяться к любому классу или методу:
[AttributeUsage(AttributeTargets.Class | AttributeTargets.Method)]
Свойство Inherited определяет, будет ли атрибут наследоваться классами, наследниками того, к которому этот атрибут применен. Это свойство может принимать два значения: true или false. По умолчанию Inherited = true. Свойство AllowMultiple Это свойство показывает, может ли атрибут применяться многократно к одному элементу. По умолчанию оно равно false, что значит – атрибут может использоваться только один раз. Ниже приведен пример создания собственного атрибута.
using System; namespace test { //Объявление атрибута [AttributeUsage(AttributeTargets.All, Inherited = false, AllowMultiple = true)] public class TestAttribute: System.Attribute { //Поле атрибута private string name; private int kod; //Свойство Name только для чтения public virtual string Name { get { return name; } } // Свойство Kod public int Kod { get { return kod; } set {kod = value; } // Назначение защищенной переменной // класса значения параметра } //Конструктор атрибута public TestAttribute(string name) { this.name = name; this.kod = 12345; } } //Конец объявления атрибута
Как видно, атрибут TestAttribute является потомком класса System. Attribute. Перед определением нового атрибута TestAttribute мы видим строку, которая определяет область применения этого атрибута
[AttributeUsage(AttributeTargets.All, Inherited = false, AllowMultiple = true)]
Далее мы определяем для нашего атрибута внутренние переменные name типа string и kod типа int. Затем в классе атрибута записано свойство Name только для чтения и свойство Kod для чтения и записи. Свойства определяются, если нужно передавать именованные параметры в конструкторы или легко и удобно получать значения полей атрибута. Затем определяется конструктор с параметром name типа string. В конструкторе мы записываем значение в поле name. Конструкторы атрибутивного класса можно перегружать, чтобы принимать различные комбинации параметров. Если для атрибутивного класса определены свойства, в нашем примере Name и Kod, для инициализации конструктора можно использовать комбинацию позиционных и именованных параметров. Обычно все обязательные параметры объявляются как позиционные, а необязательные как именованные. После создания класса атрибута мы применяем его к другому классу Test. Для этого в коде мы должны создать экземпляр атрибута TestAttribute непосредственно перед классом Test. В нашем случае возможны два варианта задания атрибута – только с позиционным параметром
[TestAttribute(" Hallow Word")]
или с позиционным и именованным параметром
[TestAttribute(" Hallow Word"), Kod=123]
Для примера используем последний вариант атрибута. В результате получим следующий текст
//Применение атрибута к классу [TestAttribute(" Hallow Word", Kod=123)] //Вызывается конструктор атрибута class Test { static void Main() { // Вызвать функцию получения и отображения атрибута GetAttribute(typeof(Test)); } public static void GetAttribute(Type t) { //Получение экземпляра атрибута TestAttribute класса Test TestAttribute att= (TestAttribute) Attribute.GetCustomAttribute(t, typeof(TestAttribute)); //Получение и вывод свойства атрибута TestAttribute Console.WriteLine(" {0}", att.Name); } } }
В классе Test в методе GetAttribute на консоль выводится значение свойства Name этого атрибута. Для этого мы воспользовались статическим методом GetCustomAttribute класса Attribute. Этот метод принимает в качестве параметров тип Test, к которому применяется атрибут, и собственно применяемый атрибут TestAttribute. Метод возвращает экземпляр атрибута, который используется для получения значения свойства Name. Метод GetAttribute вызываем в статическом методе Main. Результатом выполнения программы будет вывод на консоль слов " Hallow Word".
|