微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Delphi RTTI按属性值设置值

我有这样的课

TuserClass = class
private
 FUtilisateurCode: string; 
 FUtilisateurCle: string;
public
 procedure SetCodeInt(ACode: string; AValue: string);   
published
 [CodeInt('2800')]
 property UtilisateurCode: String read FUtilisateurCode write FUtilisateurCode;
 [CodeInt('2801')]
 property UtilisateurCle: String read FUtilisateurCle write FUtilisateurCle;
end;

procedure TuserClass.SetCodeInt(ACode: string; AValue: string); 
begin
  // what I want to is making this by RTTI to set good value to good CodeInt
  if ACode = '2800' then FutilisateurCode := AValue
  else if ACode = '2801' then FUtilisateurCle := AValue;
end;

我想使用我的SetCodeInt程序来填充我的属性值,但我有问题.
我该怎么办?

解决方法

您需要一个自定义属性类:

type
  CodeIntAttribute = class(TCustomAttribute)
  private
    FValue: Integer;
  public
    constructor Create(AValue: Integer);
    property Value: Integer read FValue;
  end;
....
constructor CodeIntAttribute.Create(AValue: Integer);
begin
  inherited Create;
  FValue := AValue;
end;

我选择将值设为一个看起来比字符串更合适的整数.

然后你定义像这样的属性

[CodeInt(2800)]
property UtilisateurCode: string read FUtilisateurCode write FUtilisateurCode;
[CodeInt(2801)]
property UtilisateurCle: string read FUtilisateurCle write FUtilisateurCle;

最后,SetCodeInt的实现是:

procedure TUserClass.SetCodeInt(ACode: Integer; AValue: string);
var
  ctx: TRttiContext;
  typ: TRttiType;
  prop: TRttiProperty;
  attr: TCustomAttribute;
  codeattr: CodeIntAttribute;
begin
  typ := ctx.GetType(Classtype);
  for prop in typ.GetProperties do
    for attr in prop.GetAttributes do
      if attr is CodeIntAttribute then
        if CodeIntAttribute(attr).Value=ACode then
        begin
          prop.SetValue(Self,TValue.From(AValue));
          exit;
        end;
  raise Exception.CreateFmt('Property with code %d not found.',[ACode]);
end;

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐