TValue.AsType<T> с типами перечислений в Delphi

Написание этого в Delphi

uses System.Classes;
...
var
  A: TAlignment;
  Value: TValue;
begin
  Value := 0;
  A := Value.AsType<TAlignment>();
end;

поднимает EInvalidCast на AsType.

Есть ли способ привести к любому типу перечисления из целочисленного значения с TValue?

Это, конечно, очевидный ответ:

A := TAlignment(Value);

но я хочу предоставить универсальную функцию, которая работает и с другими типами.

1 ответ

Это, кажется, делает это:

  if (PTypeInfo(TypeInfo(TAlignment))^.Kind = tkEnumeration) and (Value.TypeInfo.Kind = tkInteger ) then
    case System.TypInfo.GetTypeData(TypeInfo(TAlignment))^.OrdType of
      otUByte, otSByte: PByte(@A)^ := Value.AsInteger;
      otUWord, otSWord: PWord(@A)^ := Value.AsInteger;
      otULong, otSLong: PInteger(@A)^ := Value.AsInteger;
    end
  else
    A := Value.AsType<TAlignment>();

где TAlignment также может быть T в обобщенной функции.

(Скопировал идею из TRttiEnumerationType.GetValue)

Другие вопросы по тегам