【问题标题】:Can I access attributes for a property in the read and write methods我可以在读写方法中访问属性的属性吗
【发布时间】:2014-01-04 18:02:59
【问题描述】:

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

我看过的所有示例都使用加载/保存函数来循环所有属性并检查属性。我不想在读取或写入属性时从注册表中读取值,而不是加载/保存例程。但是,我不知道如何在 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;

【问题讨论】:

    标签: delphi delphi-xe3


    【解决方案1】:

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

    【讨论】:

    • 多个属性可以使用相同的getter/setter和索引组合。
    • 或者可能有多个索引属性使用不同的getter/setter,因此单独的索引不能识别属性。
    • 多个属性可以使用相同的 getter/setter 和索引组合 - 显然,一个人可能会在他的程序中犯任何类型的错误并大吃一惊。但这给了他一种他可以使用的方法(或误用,但任何方法都可以被误用)@DavidHeffernan
    • @Arioch'The 是的,我只是在陈述事实。就是这样。
    • 我会接受这个答案,因为它确实给了我这样做的方法,但听起来真正的答案是不要这样做:-)。
    【解决方案2】:

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

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

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

    【讨论】:

    • 也许一些代理类/接口可以自动生成,基于 IDispatch 甚至一些预处理器生成带有抽象虚拟 setter/getter 的存根,在运行时将填充真实的函数......跨度>
    猜你喜欢
    • 2013-06-22
    • 1970-01-01
    • 1970-01-01
    • 2012-01-03
    • 1970-01-01
    • 2013-04-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多