给定这些类;
type TMyItem = class(TObject)
private
FReference: String;
FOtherProperty: TObject;
public
property Reference: String read FReference write FReference;
property OtherProperty: String read FOtherPropertywrite FOtherProperty;
end;
type TMyListClass = class(TObjectList<TMyItem>)
public
function IndexOf(const AReference: String): Integer; overload;
end;
function TMyListClass.IndexOf(const AReference: String): Integer;
var
I: Integer;
begin
Result := -1;
for I := 0 to Count - 1 do
if Items[I].Reference = AReference then
begin
Result := I;
break;
end;
end;
type TMyClass = class(TObject)
private
FList: TObjectList<TOtherClass>;
public
property List: TObjectList<TOtherClass> read FList write FList;
end;
如何在TMyClass上实现一个属性/函数/枚举数,以便
AMyClass.List.Items[AMyClass.List.IndexOf(ARef)].OtherProperty := AOtherObject;
我能做到的
AMyClass[ARef].OtherProperty := AOtherObject;
我认为这将是一个问题,使一个默认属性,但你不能传递一个参数给一个属性,就像你传递一个函数。
2012年7月编辑。
如果我把List
变成default;
,我相信这是可行的。
AMyClass[AMyClass.IndexOf(ARef)].OtherProperty := AOtherObject;
3条答案
按热度按时间vcudknz31#
default
关键字的用法你正在考虑only works on array properties,但是你的List
属性不是一个数组属性。要获得您最初要求的语法类型:
您必须执行以下操作:
9bfwbjaz2#
编辑。抱歉,我在发帖前没有更新页面,所以我的答案和@RemyLebeau的答案差不多。
我不确定我理解的对不对,但你可以做这样的事
如果
TMyItem.FReference
是唯一的,您也可以在TMyListClass
中实现类似于TDictionary<String, TMyItem>
的内容,并直接返回TMyItem
而不是其索引上面的代码是用Lazarus 2.2.2编写的,但它应该也能在最新的 Delphi 中工作。
k97glaaz3#
这是一个简单的任务。你可以看看 Delphi 源代码中关于如何实现默认索引属性的内容。但是如果你想改进这个解决方案,你可以声明一些默认属性,这些属性取决于你将要传递的参数的类型。下面是一些代码:
现在,您可以通过引用或ItemIndex以及所有默认属性获取项: