【问题标题】:How to get the "helped" class from an helper class function?如何从帮助类函数中获取“帮助”类?
【发布时间】:2020-01-31 08:32:26
【问题描述】:

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

  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,但德尔福说E2003 Undeclared identifier: 'Self'

【问题讨论】:

标签: delphi helper delphi-xe7


【解决方案1】:

静态类方法没有“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. 

【讨论】:

    猜你喜欢
    • 2011-08-07
    • 2019-12-27
    • 2016-08-22
    • 1970-01-01
    • 2015-04-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-07
    相关资源
    最近更新 更多