請原諒以下代碼示例的詳細程度。用Delphi 2009年,我創建了兩個類TOtherClass和TMyClass:德爾福:RTTI爲2010年索引屬性?
TOtherClass = class(TObject)
public
FData: string;
end;
TMyClass = class(TObject)
private
FIndxPropList: Array of TOtherClass;
function GetIndxProp(Index: Integer): TOtherClass;
procedure SetIndxProp(Index: Integer; Value: TOtherClass);
public
property IndxProp[Index: Integer]: TOtherClass read GetIndxProp write SetIndxProp;
end;
與作爲
function TMyClass.GetIndxProp(Index: Integer): TOtherClass;
begin
Result := self.FIndxPropList[Index];
end;
procedure TMyClass.SetIndxProp(Index: Integer; Value: TOtherClass);
begin
SetLength(self.FIndxPropList, Length(self.FIndxPropList) + 1);
self.FIndxPropList[Length(self.FIndxPropList) - 1] := Value;
end;
實現訪問說明它的使用可以說明如下:
procedure Test();
var
MyClass: TMyClass;
begin
MyClass := TMyClass.Create;
MyClass.IndxProp[0] := TOtherClass.Create;
MyClass.IndxProp[0].FData := 'First instance.';
MyClass.IndxProp[1] := TOtherClass.Create;
MyClass.IndxProp[1].FData := 'Second instance.';
MessageDlg(MyClass.IndxProp[0].FData, mtInformation, [mbOk], 0);
MessageDlg(MyClass.IndxProp[1].FData, mtInformation, [mbOk], 0);
MyClass.IndxProp[0].Free;
MyClass.IndxProp[1].Free;
MyClass.Free;
end;
不要介意這個「設計」的明顯缺陷。我意識到我希望能夠通過RTTI訪問IndxProp屬性,並隨後將IndxProp移至已發佈部分。非常令人失望的是,我發現在已發佈部分中不允許使用索引屬性。據我瞭解(見Barry Kellys在How do I access Delphi Array Properties using RTTI的評論),轉向D2010不會讓我做到這一點。
在另一方面,以下是從Robert Loves blog報價:「...的屬性和方法現在都可以通過RTTI在公共和出版部,和領域所有可用的部分的。」 (我的斜體)
我的問題是這樣的:如果在D2010中有可能獲得公共字段的RTTI,那麼我的原始示例(如上所示)不應該在D2010中工作嗎?提前致謝!
謝謝,梅森。我會馬上安裝D2010。 :) – conciliator 2010-03-22 11:48:42
很高興我能幫到你。 – 2010-03-22 12:22:53
更新:Delphi XE2引入了'TRttiIndexedProperty',它提供了獲取索引屬性的運行時類型信息的功能。 – menjaraz 2012-04-10 05:54:48