如果字符串屬性很簡單,就像您說的那樣,那麼我假設您從TypInfo
單位調用GetStrProp
和SetStrProp
。對於GetObjectProp
和SetObjectProp
,類型屬性可以同樣容易。
if Supports(GetObjectProp(Obj, 'data'), IMyInterface, Intf) then
Intf.Go;
如果你並不真正需要的接口,你知道data
酒店類型TMyClass
,那麼你就可以多一點直接去:
(GetObjectProp(Obj, 'data') as TMyClass).Go;
這就需要物業有一個非空值。
如果你不知道你想要的財產的名稱,那麼你可以使用TypInfo
中的其他東西來搜索它。例如,這裏是一個函數,它將查找具有實現IMyInterface
值的對象的所有已發佈屬性;它會按順序調用Go
。
procedure GoAllProperties(Other: TObject);
var
Properties: PPropList;
nProperties: Integer;
Info: PPropInfo;
Obj: TObject;
Intf: IMyInterface;
Unk: IUnknown;
begin
// Get a list of all the object's published properties
nProperties := GetPropList(Other.ClassInfo, Properties);
if nProperties > 0 then try
// Optional: sort the list
SortPropList(Properties, nProperties);
for i := 0 to Pred(nProperties) do begin
Info := Properties^[i];
// Skip write-only properties
if not Assigned(Info.GetProc) then
continue;
// Check what type the property holds
case Info.PropType^^.Kind of
tkClass: begin
// Get the object reference from the property
Obj := GetObjectProp(Other, Info);
// Check whether it implements IMyInterface
if Supports(Obj, IMyInterface, Intf) then
Intf.Go;
end;
tkInterface: begin
// Get the interface reference from the property
Unk := GetInterfaceProp(Obj, Info);
// Check whether it implements IMyInterface
if Supports(Unk, IMyInterface, Intf) then
Intf.Go;
end;
end;
end;
finally
FreeMem(Properties);
end;
end;
德爾福2010年RTTI得到了很大的改進。有一個易於使用的單位稱爲rtti.pas。 換句話說切換到d2010,你會得到更少的痛苦。 – 2009-09-09 10:28:52
我很想這麼做,delphi中有許多很酷的新功能......但在這個項目中,我真的不能:/ - 但我會試着去得到2010年的試用版,只是爲了看看它是如何工作的,說服我的老闆:D – Leo 2009-09-09 12:58:22
目前embarcadero正在德國巡迴演出。 http://devtracks.de – 2009-09-09 13:29:17