gpt4 book ai didi

delphi - 如何从辅助类函数中获取 "helped"类?

转载 作者:行者123 更新时间:2023-12-03 15:53:37 25 4
gpt4 key购买 nike

我正在尝试编写一个辅助类函数,而不静态引用被帮助的类:

  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未声明的标识符:'Self'

最佳答案

静态类方法没有“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;
<小时/>

如果枚举是连续的,您可以使用泛型“帮助器”方法通过 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.

关于delphi - 如何从辅助类函数中获取 "helped"类?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60000341/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com