3

我可以从一个类中枚举常量(const)吗?

我试过了

MyClass = class
const
  c1 = 'c1';
  c2 = 'c2';
  c3 = 'c3';
end;

procedure GetConst();
var
  ctx: TRttiContext;
  objType: TRttiType;
  field: trttifield;
  s: string;
begin
  ctx := TRttiContext.Create;
  objType := ctx.GetType(MyClass.ClassInfo);
  for field in objType.GetDeclaredFields do
    s:= field.Name;
end;

我想得到c1,c2,c2。

这可能吗?

编辑:我想做的是为一些外部符号定义一些键(对于 cad 程序)

symbol1=class
    const
    datafield1='datafield1';
    datafield2='datafield2';
end;
symbol2=class
    const
    datafield21='datafield21abc';
    datafield22='datafield22abc';
end

我不喜欢为此使用字段,因为我不喜欢将声明和初始化分开。我不能使用枚举,因为我不能将值定义为字符串。

4

3 回答 3

5

您无法通过 RTTI 获得这些常数。我怀疑您最好的解决方案是使用属性。这不仅有实际工作的好处,而且我认为这听起来像是一个更清洁、更简单的解决方案。

于 2012-09-21T14:55:18.380 回答
4

如果您使用枚举,则可以使用TypInfo将字符串转换为枚举值,并将枚举值转换为代码中的字符串:

type
  TDataFieldName = (datafield1, datafield2, datafield3);

uses TypInfo;

var df: TDataFieldName;
begin
  df := TDataFieldName(GetEnumValue(TypeInfo(TDataFieldName), 'datafield1'));

  ShowMessage(GetEnumName(TypeInfo(TDataFieldName), Ord(df)));

  case df of
    datafield1:;
    datafield2:;
    datafield3:;
  end;
end;

(从我的脑海中输入 - 没有测试过这个......)

这样 cad 程序可以将字符串传递给您的 Delphi 应用程序,您可以将它们翻译为枚举,或者您可以将枚举翻译为字符串以传递给 cad 程序。做一个case原始值是字符串的语句也很容易,转换为枚举。由于 Delphi 不支持stringcase 语句,因此这非常方便。

于 2012-09-21T15:47:56.807 回答
0

我决定在我的课程中使用字段。由于我不想复制用于声明和初始化的字段,因此我使用 rtti 将字段初始化为字段的值。

好处是: 运行时没有 rtti 开销。rtti 仅在应用启动期间执行。我还可以使用继承,这对我的项目非常有用。

于 2012-09-22T20:54:49.363 回答