Das mit der Helper-Klasse hätte ich wohl schon gemacht, wenn im rechten Teil des Helpers auch ein generischer Typ angegeben werden könnte
Ich habe bisher drei unterschiedliche Typen von "FLAGS", je nachdem in welchem Objekt. Und jedem Set sein eigenes Helper-Objekt an die Seite zu stellen mit dreimal dem gleichen Quellcode bis auf den Typ
Ich mach' das so:
Delphi-Quellcode:
uses
TypInfo;
type
TEnumHelper = class
private
FEnumInfo: PTypeInfo;
public
Constructor Create(AEnumInfo: PTypeInfo);
function ToString(const EnumValue): string; //typloser Parameter
function ToEnum(const Name: string): integer;
end;
implementation
constructor TEnumHelper.Create(AEnumInfo: PTypeInfo);
begin
FEnumInfo := AEnumInfo;
end;
function TEnumHelper.ToString(const EnumValue): string;
begin
Result := GetEnumName(FEnumInfo, ord(TOrdType(EnumValue))); //typloser Parameter wird gecastet
end;
function TEnumHelper.ToEnum(const Name: string): integer;
begin
Result := GetEnumValue(FEnumInfo, Name);
end;
So läßt sich damit arbeiten:
Delphi-Quellcode:
//Enumeration:
TTasteBuds = (tbSour, tbSweet, tbSalty, tbSpicey, tbUmami)
//Erzeugung und Verwendung
TasteBuds := TEnumHelper.Create(TypeInfo(TTasteBuds));
showMessage(TasteBuds.ToString(tbSour)); //"tbSour"
//oder andere Richtung
var SomeTasteBud: TTasteBuds;
SomeTasteBud := TTasteBuds(TasteBuds.ToEnum(tbSour)); //hier muß zurückgecastet werden. :(
Auf eine Lösung, wie ich diesen letzten Cast einsparen kann, bin ich noch nicht gekommen. Wenn nur eine Zahl herauskommen soll, passt es.
"There are two hard things in computer science: cache invalidation, naming things, and off-by-one errors."