57 lines
3.6 KiB
HTML
57 lines
3.6 KiB
HTML
<html>
|
||
|
||
<head>
|
||
<object type="application/x-oleobject" classid="clsid:1e2a7bd0-dab9-11d0-b93a-00c04fc99f9e">
|
||
<param name="Keyword" value="Attribute">
|
||
<param name="Keyword" value="Атрибут">
|
||
</object>
|
||
<meta http-equiv="Content-Type" content="text/html; charset=windows-1251">
|
||
<title></title>
|
||
<link rel="StyleSheet" href="../../default.css">
|
||
</head>
|
||
|
||
<body>
|
||
<H1>Атрибуты</H1>
|
||
<p>В языке имеется ограниченное число стандартных атрибутов, задаваемых
|
||
ключевыми словами - например: атрибуты уровня доступа public, private и
|
||
protected, атрибуты static, virtual и override для методов. </p>
|
||
<p>Пользовательские атрибуты (далее просто атрибуты) - специальные языковые
|
||
конструкции, позволяющие помечать классы, методы, подпрограммы, параметры
|
||
некоторым именем (возможно с параметрами).</p>
|
||
<p>Например, для механизма сериализации класс помечается атрибутом
|
||
[Serializable], а поля, которые не следует сериализовывать, атрибутом
|
||
[NonSerialized]. При Unit-тестировании тестовый метод помечается атрибутом
|
||
[Test] или атрибутом [TestCase]. Распознаются атрибуты методом отражения
|
||
(рефлексии).</p>
|
||
<p>Атрибут - это обычный класс, унаследованный от System.Atribute. Например: </p>
|
||
<blockquote>
|
||
<p><code><b>type </b>AuthorAttribute = <strong>class</strong>(System.Attribute)<br>
|
||
<strong>auto</strong> property Name: string;<br> <strong>constructor</strong> (n: string);<br>
|
||
<strong>begin</strong><br> Name := n;<br> <strong>end</strong>; <strong><br>end</strong>;</code></p>
|
||
</blockquote>
|
||
<p>Следует обратить внимание, что класс атрибута принято оканчивать на <code>
|
||
Attribute</code>.</p>
|
||
<p>При пометке сущности атрибутом имя атрибута заключается в квадратные скобки. Конструктор атрибута предоставляет
|
||
также возможность использовать атрибуты с
|
||
параметрами. Например, можно пометить класс
|
||
атрибутом <code>AuthorAttribute</code>. </p>
|
||
<blockquote>
|
||
<p><code>[Author('Alex')]<b><br>type </b>My = <strong>class</strong><br> // ...<strong><br>
|
||
end</strong>;</code></p>
|
||
</blockquote>
|
||
<p>Следует обратить внимание, что окончание <code>Attribute</code> можно не
|
||
указывать.</p>
|
||
<p>Распознать, помечен ли данный класс атрибутом, можно, используя
|
||
анализ типа: </p>
|
||
<blockquote>
|
||
<p><code><strong>begin</strong> <br> <strong>var</strong> t := typeof(My);
|
||
<br> <strong>var</strong> attrs := t.GetCustomAttributes(false); <br>
|
||
<strong>foreach</strong> <strong>var</strong> attr <strong>in</strong> attrs
|
||
<strong>do</strong> <br> <strong>if</strong> attr <strong>is</strong> AuthorAttribute (<strong>var</strong> auth)
|
||
<strong>then</strong> <br> Print(auth.Name);
|
||
<br><strong>end</strong>.</code></p>
|
||
</blockquote>
|
||
<p> </p>
|
||
</body>
|
||
|
||
</html> |