Eine syntaktisch funktionierende Lösung wäre eine Deklaration in etwa so:
Delphi-Quellcode:
type
{$SCOPEDENUMS ON}
TCountryCode = (unk, AL, AD, AT, BA, BG, ...);
Damit würde TRttiEnumerationType.GetValue<TCountryCode>(AStrin g) einen AString wie z.B. "AL" oder "BG" in den entsprechenden TCountryCode umwandeln, also TCountryCode.AL bzw. TCountryCode.BG (Das "CountryCode2_" Prefix kann man sich dann sparen).
Allerdings muss man dann noch die Umsetzung in die entsprechenden TOleEnum-Werte realisieren. Dazu bietet sich eine
record helper an, in dem man auch gleich die String-Umwandlung unterbringen kann:
Delphi-Quellcode:
type
TCountryCodeHelper = record helper for TCountryCode
private const
cOleEnums: array[TCountryCode] of Cardinal = (
CountryCode2_unk,
CountryCode2_AL,
CountryCode2_AD,
...
);
function GetAsOleEnum: Cardinal;
function GetAsString: string;
procedure SetAsOleEnum(const Value: Cardinal);
procedure SetAsString(const Value: string);
public
property AsOleEnum: Cardinal read GetAsOleEnum write SetAsOleEnum;
property AsString: string read GetAsString write SetAsString;
end;
function TCountryCodeHelper.GetAsOleEnum: Cardinal;
begin
Result := cOleEnums[Self];
end;
function TCountryCodeHelper.GetAsString: string;
begin
Result := TRttiEnumerationType.GetName<TCountryCode>(Self);
end;
procedure TCountryCodeHelper.SetAsOleEnum(const Value: Cardinal);
begin
for var idx := Low(cOleEnums) to High(cOleEnums) do begin
if cOleEnums[idx] = Value then begin
Self := idx;
Exit;
end;
end;
Self := TCountryCode.unk;
end;
procedure TCountryCodeHelper.SetAsString(const Value: string);
begin
try
Self := TRttiEnumerationType.GetValue<TCountryCode>(Value);
if Ord(Self) < Ord(Low(TCountryCode)) then
raise EInvalidCast.CreateRes(@SInvalidCast);
except
on EInvalidCast do
Self := TCountryCode.unk;
end;
end;
Die Verwendung ist dann schon deutlich aufgeräumter, aber dafür muss man schon einen gewissen Aufwand treiben.