我可以在读取和写入方法中访问属性的属性

时间:2014-01-04 18:03:00

标签: delphi delphi-xe3

我想使用属性向/从注册表读取/写入属性值。

我看过的所有示例都使用加载/保存功能来遍历所有属性并检查属性。我没有使用加载/保存例程,而是在读取或写入属性时从注册表中读取值。但是,我无法弄清楚如何在Read方法中找到当前属性的名称。

我知道我的属性可以有一行getter / setter,它将正确的字符串值传递给Read / Write方法。我希望我可以使用属性。然后,当我使用我想要保存和恢复的属性定义简单类时。我不需要为这些类编写任何代码。一切都将在基类中处理。

可能这是不可能的。

我以Robert Love的这个例子为出发点: 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;

2 个答案:

答案 0 :(得分:3)

给定的getter / setter可用于多个属性。 getter / setter知道哪个属性是调用者的唯一方法是在属性声明中使用index说明符,然后将其作为输入参数传递给getter / setter。然后,getter / setter可以使用RTTI遍历拥有对象的属性,查找具有指定index的属性,然后根据需要使用该属性的属性。

答案 1 :(得分:0)

关系是该属性与getter和setter相关联。 getter / setter本身没有先验知识,它被用作getter / setter。例如,多个属性可以使用相同的getter / setter。

因此,您可以做的最好的事情就是迭代所有类型的属性,使用RTTI,将当前正在执行的方法作为属性getter / setter进行查找。这听起来不是很有趣。

我怀疑基于属性的最佳方法涉及将属性附加到getter / setter方法。