2016-07-01 13 views
0

Wie kann ich in C# eine dynamische Methode erstellen, mit der ein Ereignis behandelt werden kann? HierWie kann ich eine dynamische Methode zur Behandlung eines Ereignisses erstellen?

ist ein Ereignis:

public event EventHandler<EventArgs> refresh; 

Hier ist eine Methode:

public void Test() 
{ 

} 

Wie kann ich dynamisch eine Methode erstellen, das Refresh-Ereignis zu behandeln, so dass die dynamische Methode, um die Test-Methode aufruft ?

Die obige Testmethode ist ein Beispiel für eine Methode, die aufgerufen werden soll.

+0

Warum können Sie nicht einfach dieses Ereignis abonnieren und von dort aus die Testmethode aufrufen? – Kinetic

+0

Der Code ist für Benutzer, um Ereignisse zur Laufzeit zu abonnieren. Die obige Aufrufmethode ist nur ein Beispiel. – user3736648

+0

Also "Aktualisieren" ist ein Ereignis aus einer Klasse und Test ist eine Methode, die nicht Teil dieser Klasse ist? – Kinetic

Antwort

0

Nun, Sie könnten einfach die Veranstaltung abonnieren.

public class SomeClass 
{ 
    public event EventHandler<EventArgs> refresh; 
} 

public void Test() 
{ 
} 

void Main() 
{ 
    var some = new SomeClass(); 
    some.refresh += (sender, e) => Test(); 
    // or 
    some.refresh += Refreshed; 
} 

void Refreshed(object sender, EventArgs e) 
{ 
    Test(); 
} 
+0

Das ist, was ich tun möchte, aber ich brauche Hilfe, wie man die "Refreshed" -Methode dynamisch erstellt. – user3736648

+0

Können Sie uns nicht sagen, warum es dynamisch erstellt werden muss? – Kinetic

+0

Die "Test" -Methode ist ein Beispiel für eine Methode, die aufgerufen werden kann. Ein Benutzer kann jede Methode wählen, die aufgerufen wird. Als solche muss er dynamisch erstellt werden. – user3736648

0

Wenn die Methode, die Sie aufrufen möchten eine Instanzmethode in irgendeiner Klasse ist, und Sie haben eine Instanz dieser Klasse und den Namen der Methode können Sie Delegate.CreateDelegate() verwenden einen Delegierten zu dieser Methode zu erstellen und verwenden eine Lambda es in einem Event-Handler aufzurufen:

static EventHandler<EventArgs> CreateHandler(object methodObject, string methodName) 
{ 
    var methodDelegate = 
     (Action)Delegate.CreateDelegate(typeof(Action), methodObject, methodName); 

    return (s, e) => methodDelegate(); 
} 

Verbrauch kann dann wie folgt aussehen (Test ist in der Klasse unter der Annahme C):

refresh += CreateHandler(new C(), "Test"); 

refresh(this, EventArgs.Empty); 
+0

@ downvoter Was denkst du ist falsch mit dieser Antwort? – svick