eine Schnittstelle Gegeben:Wie kann ich eine EventInfo für ein Ereignis programmgesteuert abrufen, ohne den Namen hart zu codieren?
IEventProvider
{
event EventHandler<string> StringAvailable;
void RequestString();
}
ich eine EventInfo
für StringAvailable
durch einige Verfahren abrufen möchten, die wie folgt aufgerufen werden kann: EventInfo ei = GetEventInfo(providerInstance.StringAvailable)
oder etwas in diesem Sinne. Ich möchte keine Zeichenfolge mit dem Namen übergeben müssen.
Ich habe versucht, Lambdas und Expression-Bäume zu missbrauchen, um den Namen des Ereignisses zu extrahieren, das übergeben wurde, aber ohne Erfolg. Da Ereignisse keine erstklassigen Mitglieder in C# sind, erweist sich dies als schwierig. Ich helfe nur, einen Weg zu finden, um den Namen des Ereignisses zur Laufzeit mit Code zu erhalten, der vom Compiler statisch validiert werden kann, um sicherzustellen, dass das Ereignis zur Kompilierzeit existiert.
Meine Problemumgehung ist jetzt, alle Ereignisse aus den Klassen zu entfernen, mit denen ich arbeiten möchte, und sie in Action<T>
zu ändern. Dies ist jedoch weniger als ideal.
Für diejenigen von Ihnen, die sich wundern, warum ich das tue, möchte ich zulassen, dass Klassen, die das ereignisbasierte asynchrone Muster verwenden, automatisch zur Laufzeit mit Hilfe der IL-Generierung an async/awatet angepasst werden. In meiner obigen Beispielschnittstelle würde der Adapter und StringAvailable
umhüllen und public async Task<string> RequestStringAsync()
unter Verwendung von DynamicMethod
freilegen.
Oh mein Gott ich wusste nicht, 'nameof' war eine Sache! Das ist großartig. Vielen Dank. –