【发布时间】:2016-10-26 11:18:06
【问题描述】:
我正在尝试列出事件处理程序,其中处理程序是方法引用。 要删除特定的处理程序,我需要在列表中找到它。 但是如何比较两个方法引用的代码地址呢?
type
TEventHandler = reference to procedure;
procedure TestProc;
begin
end;
procedure TForm26.FormCreate(Sender: TObject);
var
Handlers: TList<TEventHandler>;
begin
Handlers := TList<TEventHandler>.create;
try
Handlers.Add(TestProc);
Handlers.Remove(TestProc); { doesn't work }
Assert(Handlers.Count=0); { fails }
Assert(Handlers.IndexOf(TestProc)>=0); { fails }
finally
FreeAndNil(Handlers);
end;
end;
TList 的默认比较器不能正确比较方法引用。 我该如何比较它们?是否有类似于 TMethod 的结构但用于方法引用?
【问题讨论】:
-
TEqualityComparer
.Default.Equals(A, B) -
您可以使用 TProc 代替您自己的声明...只需添加 System.SysUtils。
-
@ZENsas 我知道 TProc,我只是试图让示例尽可能清晰。 TEqualityComparer
.Default.Equals(A, B) 不起作用,我只是测试了一下(否则 TList.Remove 也会起作用,它基于默认比较器)。 -
@ZENsan
TList<T>不使用TEqualityComparer<T>但TComparer<T>但这并不重要,因为它们都失败了,因为它们只是比较引用(指针)。正如我在回答中解释的那样,传递给Add和Remove的引用是不同的。 -
@ZENsan 你没抓住重点。该列表已使用默认比较器。它认为这两种匿名方法是不同的,因为作为匿名方法,它们是不同的。
标签: delphi anonymous-methods method-reference