2011-11-23 32 views
7

Tôi có một lớp học với các đạo cụ đã xuất bản mà tôi sắp xếp thành XML.Nhận giá trị attribue của bất động sản cụ thể

MyAttr = class(TCustomAttribute) 
private 
    FName: string; 
public 
    constructor Create(const Name: string); 
    property Name: string read FName write FName; 
end; 

MyClass = class(TPersistent) 
private 
    FClassCaption: string; 
published 
    [MyAttr('Class')] 
    property ClassCaption: string read FClassCaption write FClassCaption; 
end; 

Vì kích thước XML là rất quan trọng, tôi sử dụng thuộc tính để đặt tên ngắn hơn cho thuộc tính (nghĩa là tôi không thể xác định thuộc tính có tên 'Lớp'). serialization thực hiện theo cách sau:

lPropCount := GetPropList(PTypeInfo(Obj.ClassInfo), lPropList); 
for i := 0 to lPropCount - 1 do begin 
    lPropInfo := lPropList^[i]; 
    lPropName := string(lPropInfo^.Name); 

    if IsPublishedProp(Obj, lPropName) then begin 
    ItemNode := RootNode.AddChild(lPropName); 
    ItemNode.NodeValue := VarToStr(GetPropValue(Obj, lPropName, False)); 
    end; 
end; 

tôi cần điều kiện như: nếu tài sản được đánh dấu bằng MyAttr, nhận được "MyAttr.Name" thay vì "lPropInfo^.name".

Trả lời

5

Bạn có thể sử dụng chức năng này để có được tên thuộc tính của bạn từ bất động sản nhất định (đã viết nó trong một phút, có lẽ cần một số tối ưu hóa):

uses 
    SysUtils, 
    Rtti, 
    TypInfo; 

function GetPropAttribValue(ATypeInfo: Pointer; const PropName: string): string; 
var 
    ctx: TRttiContext; 
    typ: TRttiType; 
    Aprop: TRttiProperty; 
    attr: TCustomAttribute; 
begin 
    Result := ''; 

    ctx := TRttiContext.Create; 

    typ := ctx.GetType(ATypeInfo); 

    for Aprop in typ.GetProperties do 
    begin 
    if (Aprop.Visibility = mvPublished) and (SameText(PropName, Aprop.Name)) then 
    begin  
     for attr in AProp.GetAttributes do 
     begin 
     if attr is MyAttr then 
     begin 
      Result := MyAttr(attr).Name; 
      Exit; 
     end; 
     end; 
     Break; 
    end; 
    end; 
end; 

Gọi nó như thế này:

sAttrName:= GetPropAttribValue(obj.ClassInfo, lPropName); 

Vì vậy, nếu hàm này trả về chuỗi rỗng có nghĩa là thuộc tính không được đánh dấu bằng MyAttr và sau đó bạn cần sử dụng "lPropInfo^.Name".

Các vấn đề liên quan