В качестве последнего примера запроса членов как прикрепленных к ним атрибутов мы рассмотрим способ запроса полей класса. Допустим, наш класс содержит поля, значения которых нужно сохранить в реестре. Для этого можно определить атрибут с конструктором, принимающим как параметр
епит
с ульями реестра, и строку, представляющую имя параметра реестра. Затем вы можете выполнить запрос к полю, как к разделу реестра:
using System;
using System.Reflection;
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.