Tôi đang cố gắng tạo danh sách các trình xử lý sự kiện trong đó trình xử lý là tham chiếu phương thức. Để xóa trình xử lý cụ thể, tôi cần tìm nó trong danh sách. Nhưng làm cách nào tôi có thể so sánh địa chỉ mã của hai tham chiếu phương thức?Làm cách nào để kiểm tra xem hai tham chiếu phương thức có đang tham chiếu cùng một phương thức không?
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;
So sánh mặc định của TList <> không so sánh tham chiếu phương pháp đúng cách. Tôi có thể so sánh chúng bằng cách nào? Có cấu trúc tương tự như TMethod nhưng để tham khảo phương pháp?
TEqualityComparer .Default.Equals (A, B) –
Và bạn có thể sử dụng TProc thay vì khai báo của riêng bạn ... chỉ cần thêm System.SysUtils. –
@ZENsas Tôi biết về TProc, tôi chỉ cố gắng làm ví dụ rõ ràng nhất có thể. TEqualityComparer .Default.Equals (A, B) không hoạt động, tôi chỉ kiểm tra (nếu không TList <>. Remove cũng sẽ hoạt động, nó dựa trên so sánh mặc định). –