Sử dụng Delphi 2010 và RTTI, tôi biết cách lấy loại lớp của đối tượng và cách lấy/đặt giá trị và loại thuộc tính của đối tượng, nhưng làm cách nào để xác định lớp nào trong chuỗi thừa kế một tài sản đến từ đâu? Tôi muốn sử dụng các thuộc tính của một lớp cơ sở khác với lớp chính.Delphi RTTI: Nhận lớp thuộc tính
xem xét mã này:
TClassBase = class(TObject)
published
property A: Integer;
end;
TClassDescendant = class(TClassBase)
published
property B: Integer;
end;
procedure CheckProperties(Obj: TObject);
var
ctx: TRttiContext;
objType: TRttiType;
Prop: TRttiProperty;
begin
ctx := TRttiContext.Create;
objType := ctx.GetType(Obj.ClassInfo);
for Prop in objType.GetProperties do begin
if Prop.GetClassType is TClassBase then
// do something special with base class properties
else
// standard functionality on all other properties
end;
end;
Vấn đề là không có GetClassType cho các thuộc tính. ClassType chỉ trả về TRttiInstancePropertyEx thay vì tên của lớp mà thuộc tính đó thuộc về.
Câu hỏi của bạn hơi khó hiểu. Hãy làm rõ. Chính xác thì bạn đang tìm điều gì? Bạn đang cố gắng xác định nếu 'Obj.PropertyName' trả về một đối tượng là một cá thể' TClassBase' so với một cá thể 'TClassDescendant'? Hoặc là bạn đang cố gắng để xác định nếu 'Obj.PropertyName' chính nó được khai báo là' TClassBase' bất kể loại lớp thể hiện đối tượng trả về thực hiện? 'TClassBase' và' TClassDescendant' được sử dụng bởi (các) đối tượng bạn đang kiểm tra như thế nào? –
Tôi muốn biết "làm cách nào để bạn xác định lớp nào trong chuỗi thừa kế một thuộc tính đến từ" hoặc đúng hơn là thuộc tính trong TClassBase hoặc trong TClassDescendant. Khi tôi đang đi qua các thuộc tính của một lớp, tôi muốn bỏ qua các thuộc tính lớp cơ sở. Trong tình huống cụ thể của tôi, tôi đã xuống lớp từ TInterfacedObject và đang thực hiện một chức năng trên tất cả các thuộc tính trừ khi chúng có thuộc tính [Ignore], nhưng tôi cũng muốn dễ dàng bỏ qua RefCount từ TInterfacedObject. –
Thay vì kiểm tra xem thuộc tính hiện tại có tồn tại trong một lớp cụ thể hay không, nó sẽ có ý nghĩa hơn để kiểm tra xem đối tượng được liệt kê có phải là lớp dự định hay không. Điều đó sẽ dễ thực hiện hơn và chính xác hơn. –