Das habe ich jetzt nicht verstanden.
Ich meine dass man sich eine generische Funktion schreibt bei welcher man den generischen Typen angeben MUSS. Dann hat man den Typen ja und kann sich seine TypInformation holen.
Für den Fall dass ein Enum nicht mehr als 128 (oder 256?) Einträge enthält ginge ja so etwas hier, aber perfekt ist das auch nicht
. Mein Favorit ist der zweite der drei Aufrufe.
Delphi-Quellcode:
program Project16;
{$APPTYPE CONSOLE}
{$R *.res}
uses System.TypInfo;
type
TEnum = record
public class function GetName<T>(const enum: T): String; overload; static;
public class function GetName<T>(const ordinalValue: System.ShortInt): String; overload; static;
end;
{ TEnum }
class function TEnum.GetName<T>(const enum: T): String;
var
ordinalValue: Integer;
begin
ordinalValue := Default(Integer);
Move(enum, ordinalValue, SizeOf(T));
Result := GetEnumName( TypeInfo(T), ordinalValue );
end;
class function TEnum.GetName<T>(const ordinalValue: System.ShortInt): String;
begin
Result := GetEnumName( TypeInfo(T), ordinalValue );
end;
type
TMyEnum = (uno, dos, tres);
var
myEnum: TMyEnum;
begin
myEnum := TMyEnum.dos;
// Nicht typsicher, myEnum könnte genauso gut ein Float sein
WriteLn( TEnum.GetName<TMyEnum>(myEnum) );
// Typsicher, WENN man sich zwingt EXPLIZIT "TMyEnum" anzugeben
WriteLn( TEnum.GetName<TMyEnum>(myEnum) );
// Sieht typischer aus, aber statt myEnum könnte man ebenso gut "42" reinstecken
WriteLn( TEnum.GetName<TMyEnum>( Ord(myEnum) ) );
ReadLn;
end.