【问题标题】:How do I enumerate all string properties in an interface?如何枚举接口中的所有字符串属性?
【发布时间】:2015-05-13 14:01:41
【问题描述】:

我希望(如果可能的话)枚举一个界面中的所有字符串属性,如下所示:

IXMLDocumentSummaryType = interface(IXMLNode)
    ['{AD394EAD-1253-4CA5-9F0A-76122CB53D88}']
    { Property Accessors }
    function Get_Uid: UnicodeString;
    function Get_RsUid: UnicodeString;
    //etc

    { Methods & Properties }
    property Uid    : UnicodeString read Get_Uid write Set_Uid;
    property RsUid  : UnicodeString read Get_RsUid write Set_RsUid;
    property Meta   : UnicodeString read Get_Meta write Set_Meta;
    property Error  : UnicodeString read Get_Error write Set_Error;
  end;

有很多文本属性,我只对 43 个感兴趣。所以,我将这 43 个的名称放在一个静态数组中。

   Fields: array[0..42] of RSummary= (
        (Name: 'RsUid' ; Value: ''),
        (Name: 'GbUid' ; Value: ''),
        etc...
    );

现在我想枚举属性并自动将这些属性的值放入数组中。 我有 Delphi XE7。

我试过这个:

var
  C: TRttiContext;
  T: TRttiType;
  F: TRttiField;
  P: TRttiProperty;
begin
  T:= C.GetType(IXMLDocumentSummaryType)   <----- not working

【问题讨论】:

  • 什么Delphi版本?最新版本的 RTTI 功能与旧版本不同,因此版本很重要。
  • @Ken 假设您已将接口中的相同属性放入对象中 - 属性可能存在也可能不存在于任一侧。
  • @Ken 只定义 Jerry 正在使用的接口的属性是很常见的。此外,没有理由期望给定一个接口,您可以获得一个实现对象。无论如何,这样做是一种相当可疑的做法。
  • @Ken 关于 RTTI 获取实现对象我只字未提。鉴于问题的前提是我们从接口开始,让我们这样做。换句话说,假设手头没有实现对象是合理的。
  • @Ken 我不明白你的意思。

标签: delphi interface delphi-xe7


【解决方案1】:

接口属性与类属性非常不同。接口只有方法,属性只是糖。

您不会获得接口属性的 RTTI,因为没有这样的 RTTI。

【讨论】:

  • 这太糟糕了。幸运的是,我已经手动分配了 43 个感兴趣的“属性”。所以,看来我会坚持下去。我希望我可以让代码看起来不那么意大利面。
  • 您可以枚举没有参数的函数并返回一个字符串,其名称以“Get”开头,这几乎肯定是您需要的。
  • 这是 Java 方式。这当然是一种思维方式,但“有趣”并不是我要描述的方式。 :) 说真的,这是一个很好的建议,我只是在这里稍微挖掘一下 Java 中缺乏正式的属性语法。事实上,RemObjects 的 Pascal/C# 编译器正是采用了这种思维方式,用于 Java(不仅仅是字符串)。在使用 Java 类时,遵循此 getXXX/setXXX 模式的函数作为属性出现(即,没有 get/set 并允许分配“调用”set 方法),编译器生成对相应 get/set 的调用。
猜你喜欢
  • 2015-04-14
  • 1970-01-01
  • 1970-01-01
  • 2018-11-23
  • 2018-03-31
  • 1970-01-01
  • 1970-01-01
  • 2010-11-29
  • 1970-01-01
相关资源
最近更新 更多