С атрибуты: C# и .NET | Атрибуты

Сборки .NET | Атрибуты

81

C# — Сборки .NET — Атрибуты

В C# разрешается вводить в программу информацию декларативного характера в форме атрибута, с помощью которого определяются дополнительные сведения (метаданные), связанные с классом, структурой, методом и т.д. Например, в программе можно указать атрибут, определяющий тип кнопки, которую должен отображать конкретный класс. Атрибуты указываются в квадратных скобках перед тем элементом, к которому они применяются. Следовательно, атрибут не является членом класса, но обозначает дополнительную информацию, присоединяемую к элементу.

Одной из задач компилятора .NET является генерирование описаний метаданных для всех типов, которые были определены, и на которые имеется ссылка в текущем проекте. Помимо стандартных метаданных, которые помещаются в любую сборку, программисты в .NET могут включать в состав сборки дополнительные метаданные с использованием атрибутов.

В сущности, атрибуты представляют собой не более чем просто аннотации, которые могут добавляться в код и применяться к какому-то конкретному типу (классу, интерфейсу, структуре и т.д.), члену (свойству, методу и т.д.), сборке или модулю.

Концепция аннотирования кода с применением атрибутов является далеко не новой. Еще в COM IDL (Interface Definition Language — язык описания интерфейсов) поставлялось множество предопределенных атрибутов, которые позволяли разработчикам описывать типы, содержащиеся внутри того или иного СОМ-сервера. Однако в СОМ атрибуты представляли собой немногим более чем просто набор ключевых слов. Когда требовалось создать специальный атрибут, разработчик в СОМ мог делать это, но затем он должен был ссылаться на этот атрибут в коде с помощью 128-битного числа (GUID-идентификатора), что, как минимум, довольно затрудняло дело.

В .NET атрибуты представляют собой типы классов, которые расширяют абстрактный базовый

класс System.Attribute. В поставляемых в .NET пространствах имен доступно множество предопределенных атрибутов, которые полезно применять в своих приложениях. Более того, можно также создавать собственные атрибуты и тем самым дополнительно уточнять поведение своих типов, создавая для атрибута новый тип, унаследованный от Attribute.

Ниже перечислены некоторые из предопределенных атрибутов, предлагаемые в различных пространствах имен .NET:

[CLSCompliant]

Заставляет элемент, к которому применяется, отвечать требованиям CLS (Common Language Specification — общеязыковая спецификация). Вспомните, что типы, которые отвечают требованиям CLS, могут без проблем использоваться во всех языках программирования .NET

[DllImport]

Позволяет коду .NET отправлять вызовы в любую неуправляемую библиотеку кода на С или С++, в том числе и API-интерфейс лежащей в основе операционной системы. Обратите внимание, что при взаимодействии с программным обеспечением, работающим на базе СОМ, этот атрибут не применяется

[Obsolete]

Позволяет указать, что данный тип или член является устаревшим. Когда другие программисты попытаются использовать элемент с таким атрибутом, они получат соответствующее предупреждение от компилятора

[Serializable]

Позволяет указать, что класс или структура является «сериализируемой», т.е. способна сохранять свое текущее состояние в потоке

[NonSerialized]

Позволяет указать, что данное поле в классе или структуре не должно сохраняться в процессе сериализации

[WebMethod]

Позволяет указать, что метод может вызываться посредством HTTP-запросов, и CLR-среда должна преобразовывать его возвращаемое значение в формат XML

Важно уяснить, что при применении атрибутов в коде размещающиеся внутри них метаданные, по сути, остаются бесполезными до тех пор, пока не запрашиваются явным образом в каком-то другом компоненте программного обеспечения посредством рефлексии. Если этого не происходит, они спокойно игнорируются и не причиняют никакого вреда.

Как нетрудно догадаться, в составе NET Framework 4.0 SDK поставляется множество утилит, которые позволяют производить поиск разнообразных атрибутов. Даже сам компилятор C# (csc.ехе) запрограммирован так, что он проверяет наличие разных атрибутов во время компиляции. Например, сталкиваясь с атрибутом [CLSCompilant], он автоматически проверяет соответствующий элемент и удостоверяется в том, что в нем содержатся только отвечающие требованиям CLS инструкции, а при обнаружении элемента с атрибутом [Obsolete] отображает внутри окна ErrorList (Список ошибок) в Visual Studio 2010 соответствующее предупреждение.

Помимо утилит, предназначенных для использования во время разработки, многие методы в библиотеках базовых классов .NET тоже изначально запрограммированы так, чтобы распознавать определенные атрибуты посредством рефлексии. Например, чтобы информация о состоянии объекта сохранялась в файле, все, что потребуется делать — это просто добавить в класс или структуру в виде аннотации атрибут [Serializable]. Встретив этот атрибут, метод Serialize() из класса BinaryFormatter автоматически сохраняет соответствующий объект в файле в компактном двоичном формате.

CLR-среда в .NET тоже выполняет проверки на предмет наличия определенных атрибутов. Самым известным из них, пожалуй, является атрибут [WebMethod], который применяется для создания веб-служб XML с помощью ASP.NET. Чтобы можно было получать доступ к методу посредством HTTP-запросов, а его возвращаемое значение автоматически преобразовывалось в формат XML, понадобится применить к этому методу атрибут [WebMethod], а обо всех остальных деталях будет заботиться CLR-среда. Помимо разработки веб-служб, атрибуты также играют важную роль в функционировании системы безопасности .NET, в Windows Communication Foundation, в обеспечении функциональной совместимости между СОМ и .NET, и во многом другом.

И, наконец, допускается разрабатывать приложения, способные распознавать специальные атрибуты, а также любые из тех, что поставляются в составе библиотек базовых классов .

NET. Это позволяет, по сути, создавать набор «ключевых слов», понятных только определенному множеству сборок.

Использование параметров с атрибутами сети—ArcMap

Доступно с лицензией Network Analyst.

  • Принципы действия сетевых атрибутов с параметрами
  • Установка параметризованного атрибута

Значения сетевых атрибутов иногда учитывают переменные условия. Например, высота транспортного средства позволяет определить, является ли сегмент дороги с тоннелем проходимым для этого транспорта или нет. Текущие погодные условия могут снизить скорость движения и, таким образом, повлиять на временные затраты по сети. Доступно два способа, с помощью которых можно смоделировать ограничения в зависимости от высоты транспортного средства; затраты на поездку с учетом коэффициентов масштабирования, а также других переменных экспозиций сетевого анализа. Первый способ – создать атрибут сети для каждого варианта высоты или погодных условий.

Но такой подход неудобен из-за большого количества комбинаций. Более удобно использовать один сетевой атрибут с параметром, содержащим переменную экспозицию атрибута.

Параметры представляют собой заполнители для значений, которые можно изменять для отдельного анализа. Каждый из них содержит значимое значение по умолчанию, которое при необходимости переопределяется пользователем. В ArcCatalog параметры добавляются к сетевым атрибутам и ссылаются на оценку атрибутов. Значения параметра в ArcMap можно изменить при настройке сетевых задач, поэтому значения сетевых атрибутов определяются во время выполнения, используя выражение и текущее значение параметра.

Принципы действия сетевых атрибутов с параметрами

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

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

Параметры атрибутов ограничения

Параметр «Использование ограничения» по умолчанию

Один параметр автоматически добавляется ко всем созданным атрибутам ограничения: Restriction Usage. Он определяет, будет ли атрибут ограничения запрещать, избегать или предпочитать движение на элементах, использующих ограничение. Если атрибут избегает или предпочитает элементы, далее следует задать степень избегания или предпочтения. В частности, атрибуту Restriction Usage можно присвоить любое из следующих значений (числовые значения в скобках описываются в разделе «Drive-In» под списком:

  • Запрещено – (-1) прохождение соответствующих элементов сети полностью запрещено. Это наиболее распространенный тип применения ограничения.
  • Избегать: Высокий – – (5) Очень маловероятно, что при расчете используются сетевые элементы, связанные с этим ограничением.
  • Избегать: Средний – – (2) Маловероятно, что при расчете используются сетевые элементы, связанные с этим ограничением.
  • Избегать: Низкий – – (1,3) Достаточно маловероятно, что при расчете используются сетевые элементы, связанные с этим ограничением.
  • Предпочесть: Низкий – – (0,8) Достаточно вероятно, что при расчете используются сетевые элементы, связанные с этим ограничением.
  • Предпочесть: Средний – – (0,5) Вероятно, что при расчете используются сетевые элементы, связанные с этим ограничением.
  • Предпочесть: Высокий – – (0,2) Весьма вероятно, что при расчете используются сетевые элементы, связанные с этим ограничением.
Более подробно:

Каждому из этих семи текстовых значений соответствует внутреннее представление фиксированным числовым значением, которое в вышеуказанном списке отображается в круглых скобках. Представленных текстовых значений и соответствующих им числовых значений достаточно практически для всех пользователей. Тем не менее, при необходимости точно отрегулировать степень, с которой элемент будет запрещен или предпочтен, можно ввести собственное числовое значение. Чтобы понять степень необходимости ввода пользовательского значения, нужно уяснить, какое влияние оказывают эти значения на решатель.

Для элементов со стоимостью большей, чем ноль (более свойственно ребрам), стоимость элементов с ограничениями умножается на эти числовые значения для увеличения или уменьшения стоимости, которая в свою очередь делает элементы более или менее выгодными при проведении анализа. Предпочитаемые элементы, например, умножаются на значение параметра больше 0 и меньше 1, что позволяет снизить их стоимость; следовательно, при расчете эти анализы с более высокой вероятностью будут включены в результат. Значение Предпочесть: Высокий имеет значение, близкое к 0, и Предпочесть: Низкое имеет значение, близкое к 1. (Обратите внимание, что нельзя ввести значение 0, так как это приведет к ошибке во время решения.) Для элементов, которых следует избегать, числовое значение параметра «Использование ограничения» устанавливается больше 1, так как умножение на эту величину повышает стоимость.

Для элементов с нулевой стоимостью (например, соединения, как правило, имеют нулевую стоимость в сетевых наборах данных), значение Использования ограничения больше одного (значимые элементы, которых нужно избегать), а стоимость элементов с ограничениями повышается до этого значения Использования ограничения для каждого элемента, что делает его менее привлекательным в процессе анализа. Если значение Использования ограничения меньше одного (элементы, которые следует предпочитать), стоимость элементов с ограничениями останется нулевой. Обратите внимание, что это не сделает элементы с ограничениями более привлекательными, т.к. их стоимость нулевая.

Для запрета элемента числовое значение параметра Использование ограничения устанавливается на -1. Проще говоря, можно подумать, что Network Analyst воспримет отрицательную стоимость как непроходимую, но, на самом деле внутренний процесс более сложен.

Имейте в виду, что решатель использует измененные стоимости временно. Они не включены в выходные данные анализа или в пошаговые инструкции.

Для ввода настраиваемого значения просто замените текстовые значения (Ограничено, Предпочесть:Высокий и пр.) на числовые. При вводе числового значения, совпадающего с одним из используемых текстовых значений, на экран будет выведено это текстовое значение.

Прежние версии:

При использовании набора сетевых данных из версии до ArcGIS 10.1 параметр «Использование ограничения» не будет представлен ни в одном из атрибутов ограничений. В этом случае ограничения запретит элементы сети. Обновите набор сетевых данных, чтобы иметь возможность изменять ограничения для предупреждения или предпочтения элементов.

Параметры для моделирования характеристик транспортного средства

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

Например, можно добавить атрибут ограничения вместе с параметров высоты транспортного средства для сравнения высоты машины с атрибутом дескриптора, определяющего зазор под эстакадами или туннелями. Если высота транспортного средства больше, чем зазор, ребро будет запрещено. Это может привести к выбору различных маршрутов для различных транспортных средств: как показано ниже, транспортное средство малой высоты может проехать по прямому маршруту под низким мостом, а транспорт большой высоты должен выбирать другой маршрут, в котором нет низких мостов и тоннелей.

Примечание:

В большинстве случаев, параметр Использование ограничения имеет значение Запрещено, когда атрибут ограничения зависит от характеристики транспорта. Соответственно, в этом разделе предполагается, что атрибут ограничения устанавливает запрет на элементы.

В таком сценарии необходимо создать два атрибута: атрибут признака и атрибут ограничения и присвоить им имена MaxHeight и HeightRestriction, соответственно. Атрибут MaxHeigh вытянет значения зазора из исходных данных. Атрибут HeightRestriction считает значения из MaxHeight и сравнит их с параметром текущей высоты транспортного средства. На графике внизу представлена обобщенная версия этого процесса.

Параметры по атрибутам стоимости

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

Можно создать два сетевых атрибута: DriveTime, в котором хранятся стандартные значения импеданса времени в пути со значениями, поступившими из полей в исходных данных; и DriveTime_scaled, который масштабирует значение атрибута DriveTime с помощью параметра атрибута DriveTime_scaled, содержащего коэффициент текущего масштаба.

Установка параметризованного атрибута

После создания необходимых атрибутов сети можно установить параметризованный атрибут в два этапа:

  1. Добавить параметр к атрибуту сети.
  2. Задать оценку атрибута для использования параметра.

Эти действия выполняются в ArcCatalog на вкладке Атрибуты (Attribute) диалогового окна Свойства набора сетевых данных (Network Dataset Properties) .

Более подробно о редактировании набора сетевых данных

Добавление параметра

Для создания параметра выполните следующие шаги. В примере ниже представлен атрибут ограничения HeightRestriction, но такие же процедуры выполняются и для атрибутов стоимости.

Новый параметр, Высота транспортного средства, добавляется в атрибут HeightRestriction, значение по умолчанию равно 0. (При высоте, равной 0, предполагается, что транспортное средство пройдет где угодно.) Можно изменить значения параметра, установленные по умолчанию, при проведении сетевого анализа в ArcMap.

Установка оценки

После добавления параметра необходимо разработать оценку, которая включит в себя параметр либо с константой, либо с каким-то другим атрибутом сети, в котором хранится информация относительно этого параметра. В примере ниже, параметризованному атрибуту ограничения HeightRestriction назначена оценка, которая сравнивает параметр Vehicle Height с атрибутом дескриптора MaxHeight, содержащий измерения зазора для элементов сети.

Подсказка:

Так как функция оценки скрипта рассчитывает значения во время проведения анализа с помощью VBScript или среды Python, назначение такой оценки отрицательно влияет на производительность анализа. Настоятельно рекомендуется использовать оценку функции вместо оценки скрипта для лучшей производительности при проведении анализа.

Более подробно о типах анализаторов, используемых сетью

В этом примере представлен анализатор функции. В диалоговом окне Оценка функции представлено выражение, установленное для каждой улицы. Каждый раз, когда оценка функции возвращает значение Истина, элемент сети запрещается. Если возвращается значение False, ограничения для сетевого элемента не устанавливаются, и он может использоваться в решении.

Для сравнения, параметризованный атрибут стоимости DriveTime_scaled установлен с оценкой функции (ниже), которая использует параметр коэффициента DriveTime. Анализатор считывает время движения из атрибута стоимости DriveTime и умножает его на значение коэффициента DriveTime, определенного во время работы.

Можно изменить параметр времени выполнения, отличный, от значения по умолчанию, равному 1. Значение 1.5 замедлит скорость передвижения на 50% от нормального времени. У элемента сети со значением DriveTime 5 минут значение DriveTime_scaled будет равно 7,5 минут.

Перестроение набора сетевых данных

Так как анализатор функции не хранит значения в базе данных, а рассчитывает их во время работы, нет необходимости перестраивать набор сетевых данных после добавления или изменения оценки функции или соответствующих параметров атрибута в ArcCatalog. Но после внесения изменений в связанный атрибут на основе оценки поля, необходимо перестроить набор сетевых данных для использования новых значений.

С помощью параметризованного атрибута, подготовленного в ArcCatalog, можно решать сетевые проблемы в ArcMap. При изменении значения параметра, установленного по умолчанию, нет необходимости в перестройке сети.

Связанные разделы

Работа с атрибутами

Атрибуты — это различные характеристики вашего приложения или представления ваших бизнес-объектов.

Вы можете использовать атрибуты для сопоставления бизнес-объектов, необходимых для ваших тестовых примеров.

Атрибуты используются как в TestSheets, так и в TestCase-Design Classes и могут содержать дополнительные вложенные атрибуты или экземпляры.

Пример ниже включает следующие атрибуты: данные о транспортном средстве, данные о страховании, данные о продукте и цена за год:

Пример TestSheet с атрибутами

Создание атрибута

Вы можете создавать атрибуты в TestSheet, чтобы правильно структурировать свои TestCases. Чтобы создать атрибут, выполните следующие действия:

  1. Щелкните правой кнопкой мыши объект, для которого вы хотите создать атрибут.

  2. Выберите «Создать атрибут» на мини-панели инструментов.

  3. Переименуйте атрибут по желанию. Атрибуты должны иметь уникальные имена.

Нельзя использовать специальные символы. (точка), -> (стрелка вправо) и <- (стрелка влево), чтобы назвать атрибуты TestCase-Design. Эти символы будут автоматически удалены.

Вы можете использовать сочетания клавиш Ctrl + X или Ctrl + C, чтобы вырезать или копировать атрибуты и вставлять их в другое место.

Переключить релевантность для бизнеса

Цвет значка атрибута указывает на релевантность атрибута для бизнеса. Вы можете изменить релевантность для бизнеса с помощью кнопки «Переключить релевантность для бизнеса» в меню ленты или с помощью сочетания клавиш Ctrl + F7. Все суб-атрибуты примут деловую значимость родительского атрибута.

Можно установить следующие уровни релевантности для бизнеса:

BusinessRelevant = Да

Атрибут и его податрибуты важны для бизнеса и повлияют на TestCase. Это значение по умолчанию.

BusinessRelevant = Нет

Атрибут и его вложенные атрибуты не имеют отношения к бизнесу и, следовательно, не относятся к TestCase.

BusinessRelevant = Результат

Атрибут и его вложенные атрибуты используются для проверки в тестовых примерах.

Создание двоичных атрибутов

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

Чтобы создать двоичный атрибут, выполните следующие действия:

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

  2. Выберите «Создать двоичные атрибуты» на мини-панели инструментов.

Создать двоичный атрибут

  1. В последующих диалоговых окнах вы можете указать желаемые двоичные значения. По умолчанию эти значения истинны и ложны, но вы можете изменить их по мере необходимости.

Tricentis Tosca создает новый атрибут для каждого экземпляра на уровне коллекции экземпляров с соответствующими двоичными значениями. В приведенном ниже примере два используемых экземпляра и гибрид были преобразованы в двоичные атрибуты с двоичными значениями true и false.

Двоичные атрибуты

Создание атрибутов из TestSheet

Если вы хотите использовать данные из одного TestSheet в новом TestSheet, вы можете перетащить исходный TestSheet на новый TestSheet. Исходный TestSheet и его дочерние элементы станут атрибутами нового TestSheet.

TestSheet 2 как атрибут TestSheet 1

Как показано выше, TestSheet 2 и его дочерний элемент становятся атрибутами TestSheet 1. Однако TestSheet 2 также продолжает существовать в своей первоначальной форме.

Как создать объект «платформа: шаблон» с атрибутами? — Конфигурация

рскауфманн (Ричард Кауфманн)

#1

Я использую потоковую деку Elgato и могу отображать многострочный вывод для одной кнопки… но только если данные поступают из атрибутов одного датчика. Это работает с сущностями платформы yahoofinance и rest, но я не могу понять, как это сделать с сущностью платформы шаблона. Этот код создает четыре отдельных объекта:

 - платформа: шаблон
    датчики:
      стр.:
        friendly_name: "PG&E"
        value_template: >-
          {{состояния('sensor.eagle_200_meter_power_demand') | интервал }}
      батарея:
        friendly_name: "Батт%"
        value_template: >-
          {{состояния('sensor. solaredge_storage_level') }}
      поколение:
        friendly_name: "Самостоятельное потребление"
        value_template: >-
          {{состояния('sensor.solaredge_storage_power') }}
      солнце:
        friendly_name: "Солнечная сила"
        value_template: >-
          {{состояния('sensor.solaredge_solar_power') | интервал }}
 

Вместо этого мне нужен один объект с чем-то вроде energy.pge, energy.battery и т. д.

Возможно ли это?

Спасибо,

Ричард

КингРичард (Ричард Т.)

#2

Думаю, можно, если атрибут доступен.

123 (Тарас)

#3

Этот датчик шаблона будет иметь атрибуты с именами батарея, поколение и солнце.

 - платформа: шаблон
    датчики:
      стр.:
        friendly_name: "PG&E"
        value_template: "{{ состояния('sensor.eagle_200_meter_power_demand') | int }}"
        шаблоны_атрибутов:
          батарея: "{{состояния('sensor.solaredge_storage_level') }}"
          генерация: "{{состояния('sensor.solaredge_storage_power') }}"
          солнце: "{{состояния('sensor.solaredge_solar_power') | int }}"
 

В Home Assistant это не работает. Для получения значения атрибута объекта предпочтительным методом является использование функции state_attr() (см. этот раздел документации по шаблонам).

 {{ state_attr('sensor.pge', 'батарея') }}
 

Альтернативный метод:

 {{states.sensor.pge.attributes.battery }}
 

1 Нравится

22 июля 2021 г. , 1:58

#4

Я когда-либо использовал датчики-шаблоны только для выделения атрибутов из других датчиков, но, согласно документации, это возможно. Должно быть примерно так:

 - платформа: шаблон
    датчики:
      стр.:
        friendly_name: "PG&E"
        value_template: >-
          {{состояния('sensor.eagle_200_meter_power_demand') | интервал }}
        шаблоны_атрибутов:
          батарея: "{{состояния('sensor.solaredge_storage_level') }}"
          генерация: "{{состояния('sensor.solaredge_storage_power') }}"
          солнце: "{{состояния('sensor.solaredge_solar_power') | int }}"
 

РЕДАКТИРОВАТЬ: слишком медленно.

3 лайков

(Ричард Т.)

#5

хахахах… хотя ты мужчина…

rskaufmann (Ричард Кауфманн)

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *