2014-01-04 1 views
1

Я хотел бы использовать атрибуты для чтения/записи значений свойств в/из реестра.Могу ли я получить доступ к атрибутам для свойства в методах чтения и записи

Все рассмотренные мной примеры используют функцию Load/Save, чтобы перебрать все свойства и изучить атрибуты. Вместо того, чтобы иметь процедуру загрузки/сохранения, я хотел бы прочитать значение из реестра, когда свойство читается или записывается. Однако я не могу понять, как узнать имя текущего свойства в методе чтения.

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

Возможно, это невозможно.

Я беру этот пример из Роберт Любовь, как моя отправная точка: http://robstechcorner.blogspot.de/2009/10/ini-persistence-rtti-way.html

type 

    RegValueAttribute = class(TCustomAttribute) 

    private 
    FName: string; 
    FDefaultValue: string; 

    published 
     constructor Create(const aName : string;const aDefaultValue : String = ''); 
    property Name : string read FName write FName; 
    property DefaultValue : string read FDefaultValue write FDefaultValue; 
    end; 


    TRegBaseClass = class 
    protected 
    procedure WriteString(AValue: string); 
    function ReadString: string; 
    end; 

    TMyRegClass = class(TRegBaseClass) 
    public 
    [RegValueAttribute('MySavedProperty', 'DefaultValue')] 
    property MySavedProperty: string read ReadString write WriteString; 
    end; 

    /////////////////////////////////////////// 

    function TRegBaseClass.ReadString: string; 
    begin 
    // ?? Is there any way to get the attributes for the property 
    // that got me here. 
    end; 

    procedure TRegBaseClass.ReadString(AValue: string); 
    begin 
    // ?? Is there any way to get the attributes for the property 
    // that got me here. 
    end; 

ответ

3

Указанный геттер/сеттер может использоваться для нескольких свойств. Единственный способ для геттера/сеттера узнать, какое свойство является вызывающим, - использовать спецификатор index в объявлении свойства, который затем передается в getter/setter в качестве входного параметра. Затем getter/setter может использовать RTTI для прокрутки свойств объекта-владельца, ищущего свойство с указанным index, а затем использовать атрибуты этого свойства по мере необходимости.

+0

Несколько свойств могут использовать один и тот же геттер/сеттер и индексная комбинация. –

+0

Или могут быть несколько индексированных свойств, которые используют разные геттер/сеттер, и поэтому только индекс не идентифицирует свойство. –

+0

* Множественные свойства могут использовать один и тот же приемник/сеттер и индексную комбинацию * - Очевидно, что в его программе можно делать какие-либо ошибки и стрелять в его ноги. Но это дает ему метод, который он может использовать (или злоупотреблять, но любой метод может быть использован неправильно) @DavidHeffernan –

0

Отношения в том, что имущество, связанные с ним геттер и сеттер. Сам геттер/сеттер не имеет априорных знаний о том, что он используется как геттер/сеттер. Например, несколько свойств могут использовать один и тот же getter/setter.

Таким образом, вы можете сделать все возможное, чтобы выполнить итерацию по всем свойствам типа, используя RTTI, ища текущий исполняемый метод как свойство getter/setter. Это звучит не очень весело.

Я подозреваю, что лучший подход, основанный на атрибутах, включает привязку атрибутов к методам getter/setter.

+0

Возможно, какой-либо прокси-класс/интерфейс может быть автогенерирован на основе IDispatch или даже некоторых обработчиков с предварительным процессором с абстрактным виртуальным сеттер/получателем, который будет заполнен реальными функциями во время выполнения ... –

 Смежные вопросы

  • Нет связанных вопросов^_^