Tôi muốn liệt kê tất cả các thuộc tính: riêng tư, được bảo vệ, công khai, v.v. Tôi muốn sử dụng các tiện ích được xây dựng và không sử dụng bất kỳ mã của bên thứ ba nào.Làm cách nào để liệt kê tất cả các thuộc tính trong đối tượng và nhận giá trị của chúng?
6
A
Trả lời
5
Dùng Extended RTTI như thế này (khi tôi kiểm tra mã trong XE Tôi có ngoại lệ về sở hữu ComObject, vì vậy tôi chèn thử - ngoại trừ khối):
uses RTTI;
procedure TForm1.Button1Click(Sender: TObject);
var
C: TRttiContext;
T: TRttiType;
F: TRttiField;
P: TRttiProperty;
S: string;
begin
T:= C.GetType(TButton);
Memo1.Lines.Add('---- Fields -----');
for F in T.GetFields do begin
S:= F.ToString + ' : ' + F.GetValue(Button1).ToString;
Memo1.Lines.Add(S);
end;
Memo1.Lines.Add('---- Properties -----');
for P in T.GetProperties do begin
try
S:= P.ToString;
S:= S + ' : ' + P.GetValue(Button1).ToString;
Memo1.Lines.Add(S);
except
ShowMessage(S);
end;
end;
end;
7
câu trả lời SERG là tốt nhưng nó là tốt hơn để tránh trường hợp ngoại lệ bằng cách bỏ qua một số loại:
uses
Rtti, TypInfo;
procedure TForm4.GetObjectProperties(AObject: TObject; AList: TStrings);
var
ctx: TRttiContext;
rType: TRttiType;
rProp: TRttiProperty;
AValue: TValue;
sVal: string;
const
SKIP_PROP_TYPES = [tkUnknown, tkInterface];
begin
if not Assigned(AObject) and not Assigned(AList) then
Exit;
ctx := TRttiContext.Create;
rType := ctx.GetType(AObject.ClassInfo);
for rProp in rType.GetProperties do
begin
if (rProp.IsReadable) and not (rProp.PropertyType.TypeKind in SKIP_PROP_TYPES) then
begin
AValue := rProp.GetValue(AObject);
if AValue.IsEmpty then
begin
sVal := 'nil';
end
else
begin
if AValue.Kind in [tkUString, tkString, tkWString, tkChar, tkWChar] then
sVal := QuotedStr(AValue.ToString)
else
sVal := AValue.ToString;
end;
AList.Add(rProp.Name + '=' + sVal);
end;
end;
end;
2
Dưới đây là một điểm khởi đầu tuyệt vời sử dụng khả năng tiên tiến của phiên bản mới Delphi:
- Rtti Explorer Lite bởi RRUZ.
Liên kết sau thay vì nhắm mục tiêu phiên bản đầu tiên (từ D5 trở lên). Dựa trên đơn vị TypInfo.pas, nó có giới hạn nhưng vẫn mang tính hướng dẫn:
Các vấn đề liên quan
- 1. Chức năng của PHP để liệt kê tất cả các thuộc tính của đối tượng
- 2. Cách liệt kê tất cả các thuộc tính của lớp
- 3. Làm cách nào để liệt kê tất cả các thuộc tính của một đối tượng trong pdb python?
- 4. Liệt kê tất cả các thuộc tính của đối tượng cửa sổ?
- 5. Làm thế nào tôi có thể liệt kê tất cả các thuộc tính của đối tượng Math?
- 6. Làm thế nào để liệt kê tất cả các thuộc tính phụ thuộc của kiểm soát?
- 7. Làm thế nào để đệ quy liệt kê thông qua các thuộc tính của đối tượng?
- 8. Có thể liệt kê tất cả các lớp PHP và các phương thức và thuộc tính của chúng?
- 9. Làm thế nào để liệt kê các thuộc tính của đối tượng bằng Python?
- 10. Groovy Liệt kê tất cả các thuộc tính cho lớp
- 11. Làm thế nào để lặp qua tất cả các thuộc tính XElement và nhận giá trị
- 12. Làm thế nào để lập trình liệt kê tất cả các thuộc tính được xác định?
- 13. Có cách nào để liệt kê tất cả các hiệp hội thuộc về không?
- 14. Làm cách nào để liệt kê tất cả các trường của đối tượng trong Mục tiêu-C?
- 15. Liệt kê tất cả các đối tượng của một lớp nhất định
- 16. Làm cách nào để tự động hiển thị tất cả các thuộc tính của một lớp và các giá trị của chúng trong một chuỗi?
- 17. Liệt kê và sao chép các thuộc tính từ một đối tượng này sang đối tượng khác cùng loại
- 18. Làm thế nào để viết một liệt kê của tất cả các chức năng tính toán?
- 19. Trạng thái ghi nhật ký đối tượng. Nhận tất cả các giá trị thuộc tính của nó dưới dạng chuỗi
- 20. Làm cách nào để liệt kê tất cả các đối tượng được tạo từ một lớp trong Ruby?
- 21. Làm thế nào để liệt kê tất cả các tùy chọn xây dựng CMake và các giá trị mặc định của chúng?
- 22. liệt kê các trường của đối tượng khéo léo
- 23. Tôi làm cách nào để liệt kê tất cả các tiến trình đang chạy trong Windows?
- 24. Liệt kê tất cả virtualenv
- 25. Cách lấy giá trị của thuộc tính của đối tượng theo tên thuộc tính trong PowerShell?
- 26. Làm cách nào để liệt kê tất cả các đăng ký của tôi bằng ClearCase?
- 27. Psql liệt kê tất cả các bảng
- 28. Liệt kê tất cả các chỉ mục
- 29. Liệt kê tất cả các ổ đĩa vật lý (Windows)
- 30. Làm thế nào để liệt kê tất cả các mục của tệp tar trong java?
Bạn đang làm việc với phiên bản Delphi nào? RTTI nâng cao chỉ khả dụng kể từ Delphi 2010. Phiên bản cũ hơn sẽ không thể đạt được điều này: chỉ các thuộc tính được xuất bản mới có thể được liệt kê. –
Bạn đang hỏi về việc nhận các giá trị của tất cả các thuộc tính. RTTI mới, có sẵn trong Delphi XE2, có thể làm điều này. Liên kết tôi đăng dưới dạng trùng lặp là một số tham chiếu về việc sử dụng RTTI, nói chung. Không có dấu hiệu của phiên bản Delphi bạn đang sử dụng. Vì bạn đã chỉnh sửa câu hỏi của mình, tôi đã xóa bản sao của mình. –
@DavidHeffernan, Cảm ơn bạn đã sửa đổi câu hỏi của tôi một cách độc đáo. – VibeeshanRC