È possibile ottenere part-way con un helper record, che è disponibile per i tipi di valore da XE3 in poi. Per esempio:
{$APPTYPE CONSOLE}
uses
System.SysUtils, System.TypInfo;
type
TMyEnum = (enumValue1, enumValue2);
TMyEnumHelper = record helper for TMyEnum
public
function ToString: string;
end;
function TMyEnumHelper.ToString: string;
begin
Result := GetEnumName(TypeInfo(TMyEnum), ord(Self));
end;
begin
Writeln(enumValue1.ToString);
Writeln(enumValue2.ToString);
end.
Questo programma emette il seguente:
enumValue1
enumValue2
Naturalmente è preferibile farlo in questo modo:
{$APPTYPE CONSOLE}
uses
System.SysUtils, System.TypInfo;
type
TMyEnum = (enumValue1, enumValue2);
TMyEnumHelper = record helper for TMyEnum
private
const
EnumNames: array [TMyEnum] of string = ('Friendly name 1', 'Friendly name 2');
public
function ToString: string;
end;
function TMyEnumHelper.ToString: string;
begin
Result := EnumNames[Self];
end;
begin
Writeln(enumValue1.ToString);
Writeln(enumValue2.ToString);
end.
L'output è:
Friendly name 1
Friendly name 2
Questo presumibilmente consente di affrontare il fatto che i tipi enumerati Delphi non supportano la denominazione testuale disponibile in Java.
L'altro metodo, il costruttore HTTPHeaderKey
non può essere supportato con un tipo enumerato. Il motivo è che richiede lo stato e l'unico stato per un tipo enumerato Delphi è il valore del tipo enumerato stesso. Non è possibile eseguire l'innesto su una variabile di istanza aggiuntiva come è fatto nel codice Java.
Tutto considerato, non penso che un tentativo di una traduzione letterale con un tipo enumerato funzionerà. Suggerisco di tradurre usando un record o una classe e creare la funzionalità equivalente usando i costrutti del linguaggio Delphi disponibili.
fonte
2015-02-09 10:14:30
Wow. Non sapevo che è possibile utilizzare gli helper dei record su enumerazione +1 –
@markus_ja 20 minuti fa non sapevo che sia –
grazie per la risposta, ho capito :) –