Метаданные в среде.Net. Метаданные – это что

Атрибуты

Разработчики могут добавлять метаданные в свой код благодаря атрибутам . Существует два типа (две формы) атрибутов: атрибуты, которые определены в среде CLR (т. н. англ. pseudo custom attributes ), и пользовательские атрибуты (англ. custom attributes ), создаваемые пользователем для добавления в код дополнительных сведений . С точки зрения разработчика оба типа имеют одинаковый синтаксис . Атрибуты в коде являются по сути сообщениями компилятору для создания метаданных. В CIL метаданные (такие как например, модификаторы наследования, модификаторы области видимости), а также почти все, что не является кодом операции или потоками, также помечаются как атрибуты.

Пользовательский атрибут представляет собой обычный класс , наследующий от класса Attribute . Такой атрибут может быть использован для любого метода, свойства, класса или сборки целиком при использовании следующего синтаксиса: [ИмяАтрибута (необязательный параметр , дополнительные пары имя=значение )] . Например:

Пользовательские атрибуты весьма широко используются в платформе.NET Framework. Windows Communication Framework использует атрибуты для определения сервисных контрактов, ASP.NET использует их для предоставления методов как веб-служб , LINQ к SQL использует их для привязки классов к нижележащим реляционным схемам, Visual Studio использует их для группировки свойств объекта, разработчики классов указывают категорию для класса объекта при помощи пользовательского атрибута . Пользовательские атрибуты обрабатываются кодом приложения, а не CLR. Когда компилятор находит пользовательский атрибут, то он создает пользовательские метаданные, нераспознаваемые средой CLR. Разработчик должен реализовать код для чтения и обработки метаданных. В качестве примера, атрибут, показанный в примере выше, может быть обработан следующим кодом:

Class CustomAttribute : Attribute { private int paramNumber = 0 ; private string comment = "" ; public CustomAttribute() { } public CustomAttribute(int num) { paramNumber = num; } public String Comment { set { comment = value ; } } }

Имя класса связано с именем атрибута. Компилятор среды разработки Visual C# автоматически добавляет строку « Attribute » в конец каждого имени атрибута. Как следствие, каждое имя атрибута класса должно оканчиваться такой строкой, но вполне допускается и определение атрибута без суффикса Attribute . При добавлении атрибута к какому-либо элементу компилятор ищет и по указанному имени и имени со словом Attribute на конце, то есть если написать , то компилятор будет искать и Custom и CustomAttribute . Если же они оба существуют, то компилятор сообщит об ошибке. Во избежание неоднозначности имена атрибутов могут помечаться префиксом « @ », в результате чего [@Custom] будет не то же самое что и CustomAttribute . Использование атрибута вызывает конструктор класса, причем поддерживаются и перегруженные конструкторы. Пары «имя-значение» привязываются к свойствам, при этом «имя» обозначает имя свойства, а «значение» - присвоенное значение свойства.

Иногда появляется путаница относительно добавления атрибута. Например, в следующем коде непонятно, что именно обозначается как «orange»:

В данном случае «orange» может означать какой-нибудь тестовый метод ExampleMethod , его возвращаемое значение или всю сборку целиком. В этом случае компилятор по умолчанию попытается обработать атрибут как атрибут метода. Если это не то, что предполагалось автором кода, или автор просто захотел сделать код более понятным, то допускается указание цели атрибута . Написание укажет на то, что возвращаемым значением будет «апельсин», укажет на всю сборку целиком. Допустимыми целями являются: сборка (assembly), поле (field), событие (event), метод (method), модуль (module), параметр (param), свойство (property), возвращаемое значение (return) и тип (type).

Заранее определённые атрибуты используются так же как и обычные атрибуты, но у них нет настраиваемого обработчика, поскольку компилятор содержит в себе уже встроенное описание таких атрибутов и обрабатывает код в зависимости от установленной метки. Такие атрибуты как Serializable и Obsolete реализуются именно как заранее определённые атрибуты. Заранее определённые атрибуты не должны использоваться ассемблером ILASM, поскольку у него есть собственный синтаксис для описания метаданных.

Хранение метаданных

Сборки содержат в себе таблицы метаданных, описанные в спецификации CIL. Таблицы метаданных могут иметь ноль или более записей (вхождений), причем позиция записи определяет её индекс. Когда код CIL использует метаданные, то он делает это по меткам метаданных. Это 32-битное значение, в котором первые 8 бит содержат данные, идентифицирующие соответствующую таблицу метаданных, а оставшиеся 24 бита определяют индекс метаданных в таблице. SDK платформы содержит пример, именуемый metainfo (рус. метаинформация ), перечисляющий в виде списка таблицы метаданных в сборке. Однако, эта информация довольно редко используется разработчиком. Метаданные в сборке можно просматривать при помощи утилиты ILDASM, поставляемой в составе.NET Framework SDK.

Отражение

Примечания

См. также

  • Аннотации в Java

Ссылки

  • Атрибуты в C# (рус.)
  • Метаданные в среде.Net (рус.)

Wikimedia Foundation . 2010 .

Существует множество баз данных. Чтобы понять, что они собой представляют, необходимо рассматривать их содержимое. Но есть одна маленькая полезная деталь - метаданные. Это то, что обобщает всю имеющуюся информацию. Для чего они были разработаны и зачем используются?

Что такое метаданные?

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

В основном используется четыре обозначения данного термина:

  1. Могут подразумевать субканальную информацию про используемые данные.
  2. Так называют характеристики, описывающие сущность. Они необходимы, чтобы искать, идентифицировать, оценивать и управлять значениями в БД. Ещё таким образом называют важный набор определённого количества структурированных описаний, предоставленных в допустимой форме и доступных в явном виде, благодаря чему можно найти необходимый объект. Подобная формулировка применяется в случаях, когда необходимо искать сущности, ресурсы и объекты.
  3. Данные из общей формальной системы, которые описывают свойства конкретного хранилища информации.
  4. Информация про характеристики веб-страницы (когда была создана, кто её автор).

Различие между данными и метаданными

Как их отличают? Дело в том, что провести однозначное разделение обычно невозможно. Почему? Давайте рассмотрим более детально на примере:

  1. Что-то может выступать в обеих ролях. Например, заголовок статьи может рассматриваться и как элемент метаданных, и в качестве информации, что передаётся читателю.
  2. Возможность меняться местами. Допустим, кто-то написал стихотворное произведение. Оно представляет собой данные. Композитор, опираясь на слова, создал музыкальную композицию и прикрепил данный текст. В таком случае он превращается в метаданные. Всё зависит от использования. Вообще, подобные случаи возможны из-за восприятия определённой точки зрения на основании своих суждений (тут играет роль пространство имён и система отсчёта).
  3. Возможность создания мета-…-метаданных ориентируясь на аксиому выбора. Это вытекает из того, что почти на любую информацию может быть создана своя система характеристик.

Метаданные файлов в компьютерах

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

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

Метаданные в мировой сети

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

Классификация метаданных

Как их различают? В основном классификация проводится по одному из двух принципов:

  1. Содержание. Метаданные используются, чтобы описывать файл, ресурс или его содержимое (к примеру, заголовок - «как готовить картошку»).
  2. По принадлежности. Метаданные могу использовать, чтобы информировать о чем-то целом или его составляющей. Так, название фильма относится ко всему нему, а описание эпизода информирует только об определенной части.

Если метаданные - это совокупность зависимостей от возможностей логического вывода, то в таком случае они делятся на 3 вида:

  1. «Сырые» данные. Основа информационного обеспечения.
  2. Метаданные, описывающие содержимое. Они, в свою очередь, тоже используются.
  3. Метаданные, с помощью которых можно сделать логический вывод.

Такие типы метаданных существуют.

Три наиболее востребованных класса

Предлагаем ознакомиться с тремя классами, которые сейчас широко применяются:

  1. Внутренние метаданные. Это информация, которая описывает составные части вещей, их структуру и что она собой представляет. В качестве примера можно привести размер и формат файла.
  2. Административные метаданные. Требуются для процессов обработки информации, а также для назначения вещи. Например, кто автор, редактор, когда был создан файл.
  3. Описательные метаданные. Используются, чтобы охарактеризовать природу файла и его признаки (к какой категории относится, с чем ещё связан).

Формат метаданных

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

Обычно в нём есть определённый набор, который характеризует рассматриваемый объект. Для этого используются атрибуты, свойства, элементы метаданных.
Классифицируются по охвату и подробностям описываемых ресурсов.

Возможные проблемы

Когда может возникать ошибка метаданных? Отсутствие необходимой информации или ограничение доступа - вот основные причины возникающих проблем.

Также ошибка загрузки метаданных появляется в тех случаях, когда файл есть, но он повреждён. Основных причин такого состояния насчитывают три: износ техники, вредоносное влияние отдельных программ (как правило, компьютерных вирусов) и неправильное завершение работы с документом, по причине чего данные сохранились некорректно.

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

using System; using System.Reflection; using System.Text; using System.CodeDom.Compiler; using Microsoft.CSharp; namespace DynUnloop { // Проверка в цикле class SearchLooping { public int Search(int a, int b) { int count = 0; foreach (int i in b) { foreach (int j in a) { if (i == j) { count++; break ; } } } return count; } } // Проверка cгенерированным switch"ом public interface IChecker { bool Check(int valMax); } class SearchFlat { IChecker WriteCode(int a) { StringBuilder code = new StringBuilder(); code.Append("\n namespace DynUnloop" ); code.Append("\n { class Checker: IChecker" ); code.Append("\n { bool IChecker.Check(int n)" ); code.Append("\n { switch (n)" ); code.Append("\n {" ); foreach (int j in a) code.Append("\n case " + j + ":" ); code.Append("\n return true;" ); code.Append("\n }" ); code.Append("\n return false;" ); code.Append("\n } } }\n" ); //Console.Write(code.ToString()); // проверяем сгенерированный код CSharpCodeProvider cs = new CSharpCodeProvider(); ICodeCompiler csc = cs.CreateCompiler(); CompilerParameters pars = new CompilerParameters(); pars.ReferencedAssemblies.Add(Assembly.GetExecutingAssembly().Location); CompilerResults result = csc.CompileAssemblyFromSource(pars, code.ToString()); // компилируем! if (result.Errors.Count != 0) { foreach (CompilerError err in result.Errors) Console.WriteLine(err.ToString()); return null ; } Assembly asm = Assembly.LoadFrom(result.PathToAssembly); return (IChecker)asm.CreateInstance("DynUnloop.Checker" ); } public int Search(int arr1, int arr2) { if (this .code == null ) this .code = WriteCode(arr1); int result = 0; foreach (int i in arr2) { if (this .code.Check(i)) // используем сгенерированный код result++; } return result; } IChecker code = null ; } class Test { static void Main(string args) { int a = { // Подсчитываем вхождения этих чисел в масссив arr2. 74, 97, 93, 86, 2, 78, 48, 14, 21, 58, 60, 5, 39, 4, 66, 9 , 31, 15, 69, 27, 37, 46, 62, 61, 81, 17, 88, 19, 44, 8 }; int b = { // В этом массиве ищем числа из, содержащиеся в arr1. 98, 53, 79, 47, 0, 39, 28, 18, 39, 49, 56, 17, 33, 19, 72, 13 , 28, 48, 21, 80, 10, 3, 67, 76, 83, 6, 40, 58, 23, 74, 81, 88 , 13, 48, 59, 83, 47, 1, 38, 63, 70, 21, 23, 30, 86, 71, 15, 25 , 32, 73, 23, 55, 52, 19, 90, 95, 84, 2, 63, 93, 98, 69, 93, 64 , 66, 66, 3, 84, 58, 88, 64, 26, 9, 56, 9, 88, 78, 37, 88, 11 , 89, 14, 26, 49, 50, 26, 36, 93, 56, 63, 97, 44, 37, 44, 64, 1 , 26, 58, 62, 19, 68, 30, 66, 42, 9, 96, 45, 94, 9, 2, 17, 46 , 12, 51, 3, 83, 43, 44, 14, 40, 30, 9, 27, 94, 90, 19, 87, 64 , 91, 8, 61, 20, 74, 69, 42, 59, 47, 82, 40, 52, 80, 41, 83, 54 , 45, 50, 31, 85, 41, 80, 56, 80, 44, 22, 88, 58, 3, 70, 51, 88 , 8, 80, 2, 1, 39, 96, 71, 42, 8, 43, 35, 59, 4, 60, 59, 88 , 25, 72, 48, 39, 86, 1, 23, 11, 50, 79, 74, 52, 79, 83, 56, 75 , 31, 50, 43, 0, 38, 82, 14, 48, 78, 88, 77, 97, 44, 96, 76, 83 , 61, 0, 32, 30, 22, 12, 1, 7, 56, 90, 49, 58, 21, 18, 62, 23 , 85, 58, 28, 52, 16, 58, 49, 42, 57, 98, 59, 97, 23, 25, 65, 53 , 3, 90, 89, 79, 50, 25, 53, 18, 49, 36, 42, 47, 33, 54, 27, 59 }; const int countIterations = 200000; //////////////////////////////////////////// SearchLooping searchLoop = new SearchLooping(); DateTime start = DateTime.Now; int count = 0; for (int it = 0; it < countIterations; it++) count = searchLoop.Search(a, b); TimeSpan span = DateTime.Now - start; Console.WriteLine("Search with looping. Count = {0}, Elapsed msec= {1}" , count, span.TotalMilliseconds); /////////////////////////////////////////// SearchFlat searchFlat = new SearchFlat(); DateTime start2 = DateTime.Now; int count2 = 0; for (int it = 0; it < countIterations; it++) count2 = searchFlat.Search(a, b); TimeSpan span2 = DateTime.Now - start2; Console.WriteLine("Search with switch. Count = {0}, Elapsed msec= {1}" , count2, span2.TotalMilliseconds); Console.ReadLine(); } } }

Последнее обновление: 31.10.2015

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

Аннотации данных для отображения свойств

Аннотации данных представляют собой атрибуты, которые вы можете найти в пространстве имен System.ComponentModel.DataAnnotations (хотя несколько атрибутов определено в других пространствах).

Атрибут Display

Итак, предположим у нас имеется некоторая модель Book:

Public class Book { public int Id { get; set; } public string Name { get; set; } public string Author { get; set; } public int Year { get; set; } }

И мы пытаемся получить из базы данных один объект этой модели:

Public class HomeController: Controller { BookContext db = new BookContext(); public ActionResult Index() { var firstBook = db.Books.FirstOrDefault(); return View(firstBook); } }

Используя соответствующий хелпер, мы выводим эту модель представлении: @Html.DisplayForModel() :

@model DataAnnotations.Models.Book @{ ViewBag.Title = "Книга"; } @Html.DisplayForModel()

Обычный код, но тут мы сталкиваемся с проблемой:

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

Конечно, в этом случае мы могли бы использовать @Html.LabelFor для настройки названия для каждого отдельного свойства, но в этом случае у нас бы увеличился в несколько раз объем кода, и мы не смогли бы одной строкой вывести всю информацию о модели. К тому же может потребоваться в нескольких представлениях выводить информацию о модели. Поэтому данный подход не оптимален.

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

Using System.ComponentModel.DataAnnotations; ........................................... public class Book { public int Id { get; set; } public string Name { get; set; } public string Author { get; set; } public int Year { get; set; } }

Свойство Name атрибута Display содержит строку, которая будет отображаться вместо имени свойства. Больше нам ничего не надо менять. Запустим и увидим новые названия:

Атрибут HiddenInput

В предыдущем примере у нас осталась одна проблемка - это поле Id. Иногда, конечно, может потребоваться вывод поля Id. Но, например, если бы мы выводили модель в режиме редактирования с помощью хелпера @Html.EditorForModel() , то данное поле было бы доступно для редактирования, что не очень хорошо, особенно когда идентификаторы не должны меняться. Чтобы скрыть это поле мы можем применить атрибут HiddenInput :

Using System.ComponentModel.DataAnnotations; using System.Web.Mvc; ........................................... public class Book { public int Id { get; set; } public string Name { get; set; } public string Author { get; set; } public int Year { get; set; } }

Свойство DisplayValue=false указывает, что надо скрыть данное поле. В итоге вы его не увидите:

При использовании хелперов редактирования (Html.EditorFor/Html.EditorForModel) для данного свойства будет сгенерировано скрытое поле:

Атрибут ScaffoldColumn

При редактировании модели атрибут HiddenInput полностью не скрывает поля, так как мы можем посмотреть исходный код страницы и найти соответствующие поля. Чтобы полностью скрыть свойство от хелперов, используется атрибут ScaffoldColumn :

Public int Id { get; set; }

Теперь хелперы редактирования не увидят данное свойство и не создадут для него даже скрытое поле на странице.

Атрибут DataType

Атрибут DataType позволяет предоставлять среде выполнения информацию об использовании свойства. Например, допустим, у нас есть свойство Password:

Public string Password { get; set; }

Для свойства с атрибутом DataType.Password HTML-хелперы создают элемент ввода, у которого атрибут type имеет значение "password". Тогда в браузере вы при вводе данных вы не увидите вводимые символы, а вместо них будут выводиться точки.

Перечисление DataType может принимать несколько различных значений:

Атрибут UIHint

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

Имеются следующие встроенные шаблоны:

    Boolean

    Хелперы редактирования создают флажок (checkbox) для булевых значений. Для значений типа bool? (nullable) создается элемент select с параметрами True, False и Not Set

    Хелперы отображения генерируют те же элементы html, что и хелперы редактирования, только с атрибутом disabled

    Collection

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

    Decimal

    Хелперы редактирования создают однострочное текстовое поле - элемент input

    EmailAddress

    HiddenInput

    Создается скрытое поле - элемент hidden input

    Html

    Хелперы редактирования создают однострочное текстовое поле.

    Хелперы отображения просто показывают текст

    MultilineText

    Хелперы редактирования создают многострочное текстовое поле (элемент textarea)

    Object

    Хелперы изучают свойства объекта и выбирают наиболее подходящие для него шаблоны.

    Password

    Хелперы редактирования создают текстовое поле для ввода символов с использованием маски

    Хелперы отображения показывают пароль как есть, без использования маски

    String

    Хелперы редактирования создают однострочное текстовое поле

    Хелперы редактирования создают текстовое поле

Например, используем последний шаблон Url:

Public class Book { public int Id { get; set; } public string Name { get; set; } public string Author { get; set; } public int Year { get; set; } }

Тогда мы получим следующий результат:

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




Top