Tôi đang sử dụng C#, .NET 3.5. Tôi hiểu làm thế nào để sử dụng các sự kiện, làm thế nào để khai báo trong lớp của tôi, làm thế nào để treo chúng từ một nơi khác, vv Một ví dụ contrived:C# Events hoạt động như thế nào?
public class MyList
{
private List<string> m_Strings = new List<string>();
public EventHandler<EventArgs> ElementAddedEvent;
public void Add(string value)
{
m_Strings.Add(value);
if (ElementAddedEvent != null)
ElementAddedEvent(value, EventArgs.Empty);
}
}
[TestClass]
public class TestMyList
{
private bool m_Fired = false;
[TestMethod]
public void TestEvents()
{
MyList tmp = new MyList();
tmp.ElementAddedEvent += new EventHandler<EventArgs>(Fired);
tmp.Add("test");
Assert.IsTrue(m_Fired);
}
private void Fired(object sender, EventArgs args)
{
m_Fired = true;
}
}
Tuy nhiên, những gì tôi làm không hiểu, là khi một tuyên bố trình xử lý sự kiện
public EventHandler<EventArgs> ElementAddedEvent;
Nó chưa bao giờ được khởi tạo - vì vậy, chính xác, ElementAddedEvent là gì? Nó trỏ đến điều gì? Sau đây sẽ không làm việc, bởi vì EventHandler không bao giờ được khởi tạo:
[TestClass]
public class TestMyList
{
private bool m_Fired = false;
[TestMethod]
public void TestEvents()
{
EventHandler<EventArgs> somethingHappend;
somethingHappend += new EventHandler<EventArgs>(Fired);
somethingHappend(this, EventArgs.Empty);
Assert.IsTrue(m_Fired);
}
private void Fired(object sender, EventArgs args)
{
m_Fired = true;
}
}
tôi nhận thấy rằng có một EventHandler.CreateDelegate (...), nhưng tất cả các chữ ký phương pháp đề nghị này chỉ được sử dụng để gắn Các đại biểu đến một EventHandler đã tồn tại thông qua ElementAddedEvent + = new EventHandler (MyMethod).
Tôi không chắc chắn nếu những gì Tôi đang cố gắng làm sẽ giúp ... nhưng cuối cùng tôi muốn đến với một phụ huynh trừu tượng DataContext trong LINQ có trẻ em có thể đăng ký loại bảng mà họ muốn "quan sát "vì vậy tôi có thể có các sự kiện như BeforeUpdate và AfterUpdate, nhưng cụ thể cho các loại. Một cái gì đó như thế này:
public class BaseDataContext : DataContext
{
private static Dictionary<Type, Dictionary<ChangeAction, EventHandler>> m_ObservedTypes = new Dictionary<Type, Dictionary<ChangeAction, EventHandler>>();
public static void Observe(Type type)
{
if (m_ObservedTypes.ContainsKey(type) == false)
{
m_ObservedTypes.Add(type, new Dictionary<ChangeAction, EventHandler>());
EventHandler eventHandler = EventHandler.CreateDelegate(typeof(EventHandler), null, null) as EventHandler;
m_ObservedTypes[type].Add(ChangeAction.Insert, eventHandler);
eventHandler = EventHandler.CreateDelegate(typeof(EventHandler), null, null) as EventHandler;
m_ObservedTypes[type].Add(ChangeAction.Update, eventHandler);
eventHandler = EventHandler.CreateDelegate(typeof(EventHandler), null, null) as EventHandler;
m_ObservedTypes[type].Add(ChangeAction.Delete, eventHandler);
}
}
public static Dictionary<Type, Dictionary<ChangeAction, EventHandler>> Events
{
get { return m_ObservedTypes; }
}
}
public class MyClass
{
public MyClass()
{
BaseDataContext.Events[typeof(User)][ChangeAction.Update] += new EventHandler(OnUserUpdate);
}
public void OnUserUpdated(object sender, EventArgs args)
{
// do something
}
}
Suy nghĩ về điều này khiến tôi nhận ra tôi không thực sự hiểu những gì đang xảy ra dưới Hod với các sự kiện - và tôi muốn hiểu :)
Cũng thấy câu trả lời của tôi http://stackoverflow.com/questions/2598170/question-regarding-to-value-reference-type-of-events/3854421#3854421 –