public enum HTTPHeaderKey {
CACHE_CONTROL("Cache-Control"), CONNECTION("Connection"), TRANSFER_ENCODING("Transfer-Encoding"), HOST("Host"), USER_AGENT("User-Agent"), CONTENT_LENGTH("Content-Length"), CONTENT_TYPE("Content-Type");
private final String str;
private HTTPHeaderKey(final String _str) {
str = _str;
}
/** Over ridden toString returns the HTTP/1.1 compatible header */
public String toString() {
return str;
}
};
我正在尝试将此枚举转换为Delphi。我知道如何定义枚举变量,但我不知道,我如何在枚举中插入一个方法?
或者有人可以提出另一种转换方法吗?
答案 0 :(得分:8)
您可以通过记录帮助程序获得部分路径,该记录帮助程序可用于XE3以后的值类型。例如:
{$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.
该程序输出以下内容:
enumValue1 enumValue2
当然你可能喜欢这样做:
{$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.
这里的输出是:
Friendly name 1 Friendly name 2
这可能会让您解决Delphi枚举类型不支持Java中可用的文本命名的事实。
另一种方法,枚举类型不支持构造函数HTTPHeaderKey
。原因是它需要状态,而Delphi枚举类型的唯一状态是枚举类型值本身。您不能像在Java代码中那样移植额外的实例变量。
考虑到所有事情,我不认为尝试使用枚举类型的字面翻译会有效。我建议您使用记录或类进行翻译,并使用可用的Delphi语言结构构建等效功能。
答案 1 :(得分:1)
根据Davids的回答,这个修改过的版本应该能够打印HTTP头名称:
type
THTTPHeaderKey = (hkCACHE_CONTROL, hkCONNECTION, hkTRANSFER_ENCODING);
TTHTTPHeaderKeyHelper = record helper for THTTPHeaderKey
private
const
EnumNames: array [THTTPHeaderKey] of string = ('Cache-Control', 'Connection', 'Transfer-Encoding');
public
function ToString: string;
end;
// ToString returns the HTTP/1.1 compatible header
function TTHTTPHeaderKeyHelper.ToString: string;
begin
Result := EnumNames[Self];
end;
...
begin
Writeln(hkCACHE_CONTROL.ToString);
Writeln(hkTRANSFER_ENCODING.ToString);
end.
应输出
Cache-Control
Transfer-Encoding