我可以枚举类中的常量(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
我不喜欢使用字段,因为我不想分隔声明和初始化。 我无法使用枚举,因为我无法将值定义为字符串。
答案 0 :(得分:5)
你无法通过RTTI获得这些常量。我怀疑你最好的解决方案是使用属性。这不仅具有实际工作的好处,我认为这对您的问题来说更简洁,更简单。
答案 1 :(得分: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不支持string
个案陈述。