Einzelnen Beitrag anzeigen

Der schöne Günther

Registriert seit: 6. Mär 2013
6.176 Beiträge
 
Delphi 10 Seattle Enterprise
 
#6

AW: Enum in String mehrere Overloaded Funktionen zu einer einzigen zusammenfassen?

  Alt 1. Dez 2016, 12:22
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.
  Mit Zitat antworten Zitat