我知道如何从整数值获取枚举值,我有这段代码
function GetEnumValue(intValue:integer):TMyType
begin
if(ordValue >= Ord(Low(TMyType)))and(ordValue <= Ord(High(TMyType)))then
result :=TMyType(ordValue)
else
raise Exception.Create('ordValue out of TMyType range');
end;
除了TMyType之外,我在许多枚举类型的许多地方都有类似的代码,我希望将该代码封装到基类上的单个受保护代码,因此继承的类可以使用它。
但我不知道如何推广TMyType,所以我的代码可以检查它是否是正确的枚举类型或其他类型对象
我无法弄清楚枚举基类是什么(对于所有对象类型都是TObject,对于所有VCL类型都是TControl),那么我可以像那段代码一样检查
答案 0 :(得分:4)
枚举类型没有基类型,比如TObject是类的基础。
如果您有支持泛型的Delphi版本,则可以使用以下帮助程序从序数值到枚举值进行泛型转换。
uses
System.SysUtils,TypInfo;
Type
TEnumHelp<TEnum> = record
type
ETEnumHelpError = class(Exception);
class function Cast(const Value: Integer): TEnum; static;
end;
class function TEnumHelp<TEnum>.Cast(const Value: Integer): TEnum;
var
typeInf : PTypeInfo;
typeData : PTypeData;
begin
typeInf := PTypeInfo(TypeInfo(TEnum));
if (typeInf = nil) or (typeInf^.Kind <> tkEnumeration) then
raise ETEnumHelpError.Create('Not an enumeration type');
typeData := GetTypeData(typeInf);
if (Value < typeData^.MinValue) then
raise ETEnumHelpError.CreateFmt('%d is below min value [%d]',[Value,typeData^.MinValue])
else
if (Value > typeData^.MaxValue) then
raise ETEnumHelpError.CreateFmt('%d is above max value [%d]',[Value,typeData^.MaxValue]);
case Sizeof(TEnum) of
1: pByte(@Result)^ := Value;
2: pWord(@Result)^ := Value;
4: pCardinal(@Result)^ := Value;
end;
end;
示例:
Type
TestEnum = (aA,bB,cC);
var
e : TestEnum;
...
e := TEnumHelp<TestEnum>.Cast(2); // e = cC
有一个限制:
不连续或不以零开头的枚举,
没有RTTI
TypeInfo信息。见RTTI properties not returned for fixed enumerations: is it a bug?
。