Używam C#, .NET 3.5. Rozumiem, jak wykorzystać wydarzenia, jak deklarować je w mojej klasie, jak podłączyć je gdzieś indziej, itp zmyślony przykład:Jak działają zdarzenia C# za kulisami?
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;
}
}
Jednak to, co robię nie zrozumieć, kiedy ktoś deklaruje program obsługi zdarzeń
public EventHandler<EventArgs> ElementAddedEvent;
Nigdy nie został zainicjowany - więc czym dokładnie jest ElementAddedEvent? Na co to wskazuje? Poniższa nie będzie działać, ponieważ Podprogram nie jest inicjowany:
[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;
}
}
Zauważyłem, że istnieje EventHandler.CreateDelegate (...), ale wszystkie podpisy metoda sugerują ten służy wyłącznie do mocowania delegatów już istniejący EventHandler poprzez typowy ElementAddedEvent + = new EventHandler (MyMethod).
Nie jestem pewien, czy co próbuję zrobić pomoże ... ale ostatecznie chciałbym wymyślić abstrakcyjnego nadrzędnej DataContext w LINQ którego dzieci mogą zarejestrować która tabela Rodzaje chcą „obserwowanego ", więc mogę mieć zdarzenia takie jak BeforeUpdate i AfterUpdate, ale specyficzne dla typów. Coś takiego:
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
}
}
Myśląc o tym uświadomił mi, ja naprawdę nie rozumiem, co się dzieje pod Hod z imprez - i chciałbym zrozumieć :)
Zobacz także moją odpowiedź http://stackoverflow.com/questions/2598170/question-regarding-to-value-reference-type-of-events/3854421#3854421 –