我有这样的课
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;
解决方法
您需要一个自定义属性类:
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 举报,一经查实,本站将立刻删除。