Übergeben Sie einen Rückgabewert zurück, die durch einen EventHandler
Ich versuche zu schreiben, um eine API und ich muss zum Aufruf eines Event-Handler, wenn ich Daten aus einer Tabelle. So etwas wie dieses:
public override bool Run(Company.API api)
{
SomeInfo _someInfo = new SomeInfo();
if (_someInfo.Results == 1)
return true;
else
return false;
using (MyTable table = new MyTable(api))
{
table.WhenData += new EventHandler<DataEventArgs<Record>>(table_WhenData);
table.WhenDead += new EventHandler<EventArgs>(table_WhenDead);
table.Start();
}
public void table_WhenData(object sender, DataEventArgs<Record> e)
{
return true;
}
Das problem Im habend ist, ich weiß nicht, wie Sie passieren einen Rückgabewert zurück aus table_WhenData der Run-Methode.
Ive versucht, viele Möglichkeiten (wie der Versuch, einen pass _someInfo der Methode) aber ich einfach nicht scheinen, um Holen Sie sich die syntax Recht.
Jeder Vorschlag wird sehr geschätzt.
InformationsquelleAutor der Frage Leroy Jenkins | 2009-09-18
Du musst angemeldet sein, um einen Kommentar abzugeben.
Dem Allgemeinen Muster hier ist, nicht zurückzukehren, die Daten von dem event-handler, aber das hinzufügen von Eigenschaften zu Ihrem Ereignis-argument-Objekt, so dass der Verbraucher von der Veranstaltung können die Eigenschaften, die der Anrufer kann dann zugreifen. Dies ist sehr Häufig in UI-handling-code, sehen Sie die Cancel-Ereignis-Konzept ganz über dem Platz.
Den folgenden pseudo-code, und nicht kompilieren bereit. Seine Absicht ist es, zu zeigen, das Muster.
Bearbeiten
Mag ich, wie Jon Skeet formuliert: machen die
EventArgs
mutuable. Das heißt, die Verbraucher von der Veranstaltung kann sich ändern, den Zustand derEventArgs
Objekt, so dass für die raiser von der Veranstaltung, um sich auf diese Daten.InformationsquelleAutor der Antwort JoshBerke
Ich weiß, dies ist eine alte post, aber nur für den Fall jemand kommt über es, ist es sicherlich möglich, dies zu tun. Erklären Sie mit Ihren eigenen Delegierten, die einen Wert zurückgibt, dann base die Veranstaltung ab, die von diesem neuen Delegierten. Hier ist ein Beispiel:
Im Falle der Alleinspieler /publisher:
In der Ereignis-Abonnent:
.NET bietet ein Beispiel dieser in das AssemblyResolve-Ereignis, das die ResolveEventHandler delegieren, um die Daten, in diesem Fall einen Verweis auf die gewünschte Montage. MSDN-Artikel über das AssemblyResolve-Ereignis
Habe ich persönlich sowohl das AssemblyResolve-Ereignis und die benutzerdefinierten Delegaten-Technik für die Rückgabe von Daten von einem Ereignis, und Sie arbeiten wie erwartet auf Visual Studio 2010.
InformationsquelleAutor der Antwort AFischbein
Der einzige Weg, die Sie tun können, es zu machen, ist eines der Argumente (vorzugsweise die "Argumente" eher als der Absender) verändert werden. Wenn es nicht bereits verändert, haben Sie grundsätzlich Probleme haben - es gibt einfach keine Möglichkeit, sich die Informationen heraus.
(Okay, es gibt eine Möglichkeit - Sie können das event-argument selbst unveränderlich, aber machen ein member, eine Methode, die endet Aufruf einer delegate registriert, indem der code auslösen des Ereignisses in den ersten Platz. Aber das ist grauenhaft...)
InformationsquelleAutor der Antwort Jon Skeet
Eine einfache Lösung ist die Verwendung von einem Verschluss:
InformationsquelleAutor der Antwort Igor ostrovsky