Sử dụng hệ thống RTTI trong Delphi 2010, có cách nào để tìm hiểu xem thuộc tính có phải là TDateTime không? Nó hiện đang xử lý nó như là một đôi bất cứ khi nào tôi gọi lại asVariant và cũng có thể nếu tôi kiểm tra loại tài sản. Đây có phải là do thực tế nó chỉ có thể nhìn thấy loại cơ sở? (TDateTime = kép)Làm thế nào tôi có thể phân biệt các thuộc tính TDateTime từ các thuộc tính Đôi với RTTI?
17
A
Trả lời
22
Hãy thử kiểm tra Name
tài sản của TRttiProperty.PropertyType
Tôi không có Delphi năm 2010, nhưng công trình này trong XE.
{$APPTYPE CONSOLE}
uses
SysUtils,
Classes,
Rtti;
type
TMyClass =class
private
FDate: TDateTime;
FProp: Integer;
FDate2: TDateTime;
FDate1: TDateTime;
public
property Date1 : TDateTime read FDate1 Write FDate1;
property Prop : Integer read FProp Write FProp;
property Date2 : TDateTime read FDate2 Write FDate2;
end;
var
ctx : TRttiContext;
t : TRttiType;
p : TRttiProperty;
begin
ctx := TRttiContext.Create;
try
t := ctx.GetType(TMyClass.ClassInfo);
for p in t.GetProperties do
if CompareText('TDateTime',p.PropertyType.Name)=0 then
Writeln(Format('the property %s is %s',[p.Name,p.PropertyType.Name]));
finally
ctx.Free;
end;
Readln;
end.
mã này trả về
the property Date1 is TDateTime
the property Date2 is TDateTime
3
Điểm then chốt ở đây trong khi xác định loại là loại chỉ thị. Hai định nghĩa khác nhau:
Type
TDateTime = Double; // here p.PropertyType.Name returns Double
but
Type
TDateTime = type Double; // here p.PropertyType.Name returns TDateTime
or
Type
u8 = type Byte; // here p.PropertyType.Name returns u8
but
Type
u8 = Byte; // here p.PropertyType.Name returns Byte !
+0
Rõ ràng OP không khai báo các loại được đề cập, vì vậy về mặt kỹ thuật, đây không phải là câu trả lời, nhưng bạn hoàn toàn đúng và lời giải thích bổ sung này là thông tin tốt. +1 – NGLN
Vâng, một ngày/giờ luôn luôn là một đôi, trong đó một phần số nguyên đại diện cho ngày, trong khi phần thập phân đại diện cho phút và giây (như là một phần của một ngày) – Marco
Tôi hiểu đó là một đôi về mặt kỹ thuật nhưng có cách nào tôi có thể sử dụng RTTI để kiểm tra nếu nó được định nghĩa là một TDateTime ban đầu – Barry