Принципы объектно-ориентированного программирования

          

Атрибуты поля



Атрибуты поля

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

using System;

using System.Reflection;

public enum RegistryHives {

HKEY_CLASSES_ROOT,

HKEY_CURRENT_USER,

HKEY_LOCAL_MACHINE,

HKEYJJSERS,

HKEY_CURRENT_CONFIG >

public class RegistryKeyAttribute : Attribute <

public RegistryKeyAttribute(RegistryHives Hive, String ValueName)

{

this.Hive = Hive; this.ValueName = ValueName; }

protected RegistryHives hive; public RegistryHives Hive {

get { return hive; }

set { hive = value; } >

protected String valueName; public String ValueName {

get { return valueName; }

set { valueName = value; } } }

class TestClass <

[RegistryKey(RegistryHives.HKEY_CURRENT_USER, "Foo")]

public int Foo;

public int Bar; }

class FieldAttrApp {

public static void Main() {

Type type = Type.GetTypeC'TestClass"); foreach(Field!nfo field in type.GetFieldsQ) {

foreach (Attribute attr in field.GetCustomAttributesO) {

F.agistryKeyAttribute registryKeyAttr =

attr as RegistryKeyAttribute; if (null != registryKeyAttr) {

Console.WriteLine

("{0} будет сохранен в Ш\\\\{2}", field.Name,

/

registryKeyAttr.Hive, registryKeyAttr.ValueName); } } } } }

Я не буду описывать выполнение каждого этапа этого кода, так как он в чем-то дублирует предыдущий пример. Однако пара деталей все же важна для нас. Во-первых, как и объект Methodlnfo, определенный для получения информации о методе из объекта типа, объект Fieldlnfo предоставляет аналогичную функциональность для получения из объекта сведений о поле. Как и в предыдущем примере, мы начнем с получения объекта типа, ассоциированного с нашим тестовым классом. Затем мы циклически обработаем массив Fieldlnfo, а также все атрибуты каждого объекта Fieldlnfo, пока не найдем нужный — RegistryKeyAttribute. Если мы его обнаружим, то выведем имя поля и значения полей атрибута Hive и ValueName.



Содержание раздела