首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何从helper类函数中获取“helper”类?

如何从helper类函数中获取“helper”类?
EN

Stack Overflow用户
提问于 2020-01-31 16:32:27
回答 1查看 108关注 0票数 3

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

代码语言:javascript
复制
  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;

有没有一种动态获取帮助类的方法?我的意思是像下面这样的代码:

代码语言:javascript
复制
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'

EN

回答 1

Stack Overflow用户

发布于 2020-01-31 17:12:46

静态类方法没有"self“参数。他们也不能访问任何实例成员。(它们仍然可以访问类字段、类属性和类方法。)

在这种情况下(帮助器是记录帮助器),类方法必须声明为静态。

正如@David指出的,普通的类方法(不是静态的)可以用"Self“键引用它的类型,但只有当它引用一个类的时候。

示例:

代码语言:javascript
复制
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获取范围。

代码语言:javascript
复制
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. 
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/60000341

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档