Wie funktionieren C # Events im Hintergrund?

Ich bin mit C#, .NET 3.5. Ich verstehe, wie er Ereignisse, wie deklarieren Sie in meiner Klasse zu, wie Sie Haken Sie von woanders, etc. Ein erfundenes Beispiel:

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;
    }
}

Jedoch, was ich tun nicht verstehen, wenn man erklärt einen event-handler

public EventHandler<EventArgs> ElementAddedEvent;

Es ist nie initialisiert - also, was, genau, ist ElementAddedEvent? Was hat es zu zeigen? Im folgenden wird nicht funktionieren, weil der Event-Handler wird nie initialisiert:

[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;
    }
}

Ich merke, dass es ein Event-Handler.CreateDelegate(...), aber alle Signaturen vorschlagen, dieses dient nur zur Befestigung Delegierten zu einem bereits vorhandenen Event-Handler durch die typischen ElementAddedEvent += new EventHandler(MyMethod).

Ich bin mir nicht sicher, ob was ich versuche zu tun, wird helfen,... aber eigentlich würde ich gern kommen mit einer abstrakten übergeordneten DataContext in LINQ, deren Kinder registrieren können, welche Tabellentypen Sie wollen "beobachtet" also ich kann schon Veranstaltungen wie BeforeUpdate und AfterUpdate, sondern bestimmte Typen. So etwas wie dieses:

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
    }
}

Sich Gedanken über gemacht mich erkennen, dass ich nicht wirklich verstehen, was vorgeht unter der hod mit Veranstaltungen - und ich würde das gerne verstehen 🙂

InformationsquelleAutor der Frage Matt | 2008-10-17

Schreibe einen Kommentar