2011-12-08 25 views
12

Tôi cần có danh sách các loại biểu mẫu, nhưng chỉ cho các loại có nguồn gốc từ một biểu mẫu cơ sở nhất định.Làm thế nào để có được danh sách các lớp học bắt nguồn từ một lớp nhất định, với RTTI nâng cao?

tôi sử dụng Delphi năm 2010 và tăng cường RTTI để duyệt các loại

mã hiện tại của tôi là:

rc := TRTTIContext.Create; 
rtyps := rc.GetTypes; 
for rtyp in rtyps do 
begin 
    if not(rtyp.IsInstance) then Continue; 

    // Now I need to check if rtyp.AsInstance.MetaclassType is derived from TMyBaseForm 
end; 

Tôi không muốn instanciate một đối tượng và sử dụng 'là' nhà điều hành, vì nó sẽ không thực hiện kịp thời.
Là một workaround hiện tại, tôi kiểm tra nếu một phương pháp, được giới thiệu trong TMyBaseForm, đã được tìm thấy trong bối cảnh RTTI:

if (rtyp.GetMethod('MyMethod') = nil) then Continue; 

nhưng đây không phải là một giải pháp trong sạch, vì nó có thể dẫn đến vấn đề nếu một phương pháp với cùng tên đã được giới thiệu trong một nhánh khác.

Vì vậy, câu hỏi của tôi: là có cách thông thường để phát hiện xem loại lớp có bắt nguồn từ loại lớp khác không?

Cảm ơn,

+2

Tôi không biết cách triển khai bằng RTTI, nhưng có chức năng [ClassParent] (http://docwiki.embarcadero.com/VCL/en/System.TObject.ClassParent). Nó trả về kiểu tổ tiên ngay lập tức của một lớp. Hoặc nếu bạn cần tìm hiểu xem một loại hoặc đối tượng lớp cụ thể có phải là một thể hiện của một lớp hoặc một trong các lớp con của nó hay không, hãy sử dụng [InheritsFrom] (http://docwiki.embarcadero.com/VCL/en/System.TObject.InheritsFrom) chức năng. – TLama

Trả lời

13

Khi bạn gọi AsInstance lợi nhuận một TRttiInstanceType, từ đó bạn phải truy cập vào Mà MetaclassType bất động sản là một tài liệu tham khảo TClass để loại phản ánh, cuối cùng sử dụng TClass bạn có thể gọi InheritsFrom chức năng

for rtyp in rtyps do 
if (rtyp.TypeKind=tkClass) and rtyp.IsInstance and rtyp.AsInstance.MetaclassType.InheritsFrom(TMyBaseForm) then 
begin 

    // do something 
end; 
+3

OMG, chỉ cần bỏ lỡ phương pháp này từ TClass ... chỉ là một ngày tồi tệ hoặc cần cà phê thời gian, tôi đoán. Cảm ơn câu trả lời của bạn – user315561

+2

+1 @ user315561 cà phê luôn hoạt động! (: – ComputerSaysNo

+1

+1 cho 'AsInstance' –

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