Bạn cần triển khai thêm và xóa người truy cập trên sự kiện, sau đó kiểm tra danh sách đích của đại biểu hoặc lưu trữ các mục tiêu trong danh sách.
Trong phương thức thêm, bạn có thể sử dụng phương thức Delegate.GetInvocationList để nhận danh sách các mục tiêu đã được thêm vào đại biểu.
Vì các đại biểu được xác định để so sánh nếu chúng được liên kết với cùng một phương pháp trên cùng một đối tượng đích, bạn có thể chạy qua danh sách đó và so sánh, và nếu bạn thấy không có gì so sánh bằng nhau, bạn thêm mới .
Dưới đây là mẫu mã, biên dịch như giao diện điều khiển ứng dụng:
using System;
using System.Linq;
namespace DemoApp
{
public class TestClass
{
private EventHandler _Test;
public event EventHandler Test
{
add
{
if (_Test == null || !_Test.GetInvocationList().Contains(value))
_Test += value;
}
remove
{
_Test -= value;
}
}
public void OnTest()
{
if (_Test != null)
_Test(this, EventArgs.Empty);
}
}
class Program
{
static void Main()
{
TestClass tc = new TestClass();
tc.Test += tc_Test;
tc.Test += tc_Test;
tc.OnTest();
Console.In.ReadLine();
}
static void tc_Test(object sender, EventArgs e)
{
Console.Out.WriteLine("tc_Test called");
}
}
}
Output:
tc_Test called
(tức là chỉ một lần.)
Nguồn
2009-06-01 22:54:42
Bạn cần sử dụng System.Linq bằng cách sử dụng. –
Chỉ để làm rõ nhận xét của Hermann; bạn phải bao gồm không gian tên 'System.Linq' bằng cách thêm 'using System.Linq' vào lớp của bạn hoặc không gian tên hiện tại. –
Hấp dẫn. LINQ vẫn còn đủ mới với tôi rằng tôi phải tìm kiếm nó và được nhắc nhở nó có nghĩa là Ngôn ngữ truy vấn tích hợp ... và sau đó tự hỏi những gì đã làm với EventHandlers và InvocationList của họ? – fortboise