我正在尝试编写一个帮助器类函数,而不是静态地引用帮助的类:
TMyEnum = (meA, meB, meC);
TMyEnumHelper = record helper for TMyEnum
public
class function InRange(AValue : integer) : Boolean; static;
end;
...
class function TMyEnumHelper.InRange(AValue : Integer) : Boolean;
begin
Result := (
(AValue >= Ord(Low(TMyEnum))) and
(AValue <= Ord(High(TMyEnum)))
);
end;有没有一种动态获取帮助类的方法?我的意思是像下面这样的代码:
class function TMyEnumHelper.InRange(AValue : Integer) : Boolean;
begin
Result := (
(AValue >= Ord(Low(HelpedClass))) and
(AValue <= Ord(High(HelpedClass)))
);
end;我试过使用Self,但Delphi说E2003 Undeclared identifier: 'Self'
发布于 2020-01-31 17:12:46
静态类方法没有"self“参数。他们也不能访问任何实例成员。(它们仍然可以访问类字段、类属性和类方法。)
在这种情况下(帮助器是记录帮助器),类方法必须声明为静态。
正如@David指出的,普通的类方法(不是静态的)可以用"Self“键引用它的类型,但只有当它引用一个类的时候。
示例:
type
TMyClass = class
end;
TMyClassHelper = class helper for TMyClass
class function NameOfClass : String;
end;
class function TMyClassHelper.NameOfClass : String;
begin
Result := Self.ClassName;
end;如果枚举是连续的,您可以使用泛型"helper“方法通过RTTI获取范围。
type
TRttiHelp = record
class function EnumInRange<TEnum>(AValue: Integer) : Boolean; static;
end;
class function TRttiHelp.EnumInRange<TEnum>(AValue: Integer) : Boolean;
var
typeData: PTypeData;
begin
if GetTypeKind(TEnum) <> tkEnumeration then
raise EInvalidCast.CreateRes(@SInvalidCast);
typeData := GetTypeData(TypeInfo(TEnum));
Result := (AValue >= typeData.MinValue) and (AValue <= typeData.MaxValue);
end;
type
TMyEnum = (a,b,c);
begin
WriteLn(TRttiHelp.EnumInRange<TMyEnum>(2)); // Writes true
end. https://stackoverflow.com/questions/60000341
复制相似问题