uses TypInfo, SysUtils, SysConst; type TEnumHelper = record class function GetEnumName<T>(Value: T): String; static; class function GetEnumValue<T>(const Name: String): T; static; end; class function TEnumHelper.GetEnumName<T>(Value: T): String; var P: PTypeInfo; IValue: Integer; begin P := TypeInfo(T); if P = nil then begin raise EInvalidOpException.CreateRes(@SVarNotImplemented); end; IValue := 0; Move(Value,IValue,SizeOf(T)); Result := TypInfo.GetEnumName(P,IValue); end; class function TEnumHelper.GetEnumValue<T>(const Name: String): T; var P: PTypeInfo; IValue: Integer; begin P := TypeInfo(T); if P = nil then begin raise EInvalidOpException.CreateRes(@SVarNotImplemented); end; IValue := TypInfo.GetEnumValue(P,Name); with GetTypeData(P)^ do begin if (IValue < MinValue) or (IValue > MaxValue) then begin raise ERangeError.CreateRes(@SRangeError); end; Result := Default(T); Move(IValue,Result,SizeOf(T)); end; end;
TEnumHelper.GetEnumNameの型パラメータは省略可能です(引数の型から自動的に推論されます)が、TEnumHelper.GetEnumValueについては型パラメータが必須となります。
var Alignment: TAlignment; begin Alignment := TEnumHelper.GetEnumValue<TAlignment>('taLeftJustify'); end; var S: String; begin S := TEnumHelper.GetEnumName(taLeftJustify); end;
こんな感じで使うことができます。
0 件のコメント:
コメントを投稿