Konvertieren delegate System.Aktion
Einführung
In meinem WP8 C#/XAML-Projekt ich bin über Ereignisse zu Benachrichtigen, die meine Ansicht, dass einige asynchrone Prozess abgeschlossen ist.
Habe ich zwei Arten der Delegierten.
Ich bin erstellen von Ereignissen, von denen die Delegierten und es gibt mehrere von Ihnen Benachrichtigung meiner Ansicht, dass einige Tätigkeit beendet oder gestartet (um zu zeigen, progressbar, navigieren Sie zu einer anderen Seite, deaktivieren Sie einige Steuerelemente et cetera).
Zu erhöhen, um diese Ereignisse, die ich will, um ein eigenes "Benachrichtigung-Methode", die erhöhen würde diejenigen Delegierten.
Die Methode, die ich im Sinn haben, ist im Code-Beispiel unten als fireUpEvent
Methode.
Code-Beispiel
ReturnState enum
public enum ReturnState : int
{
state1 = 0,
... //for the purpose of the presentation
state6 = 15
...
}
Definitionen von events & Methoden
public delegate void LoadingStartedEventHandler();
public delegate void LoadingFinishedEventHandler(ReturnState state);
public event LoadingStartedEventHandler LoadingStarted;
public event LoadingFinishedEventHandler LoadingFinished;
private void fireUpEvent(Action<ReturnState> action, Returnstate parameter)
{
if(action != null)
{
action(parameter);
}
}
private void fireUpEvent(Action action)
{
if(action != null)
{
action();
}
}
Nutzung
fireUpEvent(LoadingFinished, ReturnState.state1);
Beschreibung
Das problem ist, dass wenn ich versuche zu kompilieren bekomme ich eine Fehlermeldung:
Argument1: Cannot convert from 'XXXX.YYYY.SomeClass.LoadingFinishedEventHandler' to 'System.Action<XXXX.YYYY.Returnstate>'
Ich habe versucht zu googeln, aber habe keine gefunden nützliche Sachen.
Warum ist es nicht Cabrio?
Ich möchte Action<ReturnState>
und Action
in diesen Methoden anstelle von bestimmten Delegierten, ist es möglich?
Sollte ich mit jedem anderen "Typ" wie Action
statt?
Die nur zwei ich weiß von dieser "grooup" sind Func
& Action
gibt es andere?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Antwort auf diese Zeile:
Sind Sie verschiedenen Delegat-Typen, und es gibt keine Referenz Umstellung zwischen verschiedenen Delegat-Typen (anders als in der generische Delegat-Typen mit generischer Varianz). Sie können eine
Action
aus einerLoadingStartedEventHandler
wie diese:... und Sie könnte das gleiche tun, die andere Weise herum, und mit Ihren anderen Delegaten-Typ und die
Action<T>
. Aber es gibt wirklich keine Notwendigkeit, dies zu tun.Ja - nur nicht erklären, die Ereignisse, die mit jenen Delegierten, und zwar nicht, erklären die Delegierten an alle!
Können Sie dies ändern:
Zu diesem:
Beachten Sie, dass dies gegen die .NET übereinkommen auf Veranstaltungen, wohlgemerkt. Von convention, events deklariert sind, mit einer Stellvertretung, wo der erste parameter ist der "sender", der Typ
object
, und der zweite parameter ist ein abgeleiteter Typ vonEventArgs
(oderEventArgs
selbst). Ob oder nicht, das ist Ihnen wichtig für Sie ist zu entscheiden. Wenn Sie sich entscheiden, Folgen der Konvention, Sie hatte im Grunde möchten, erstellen Sie eine Art der Ableitung vonEventArgs
holding einReturnState
ersetzen und dann die Ereignisse mit:Und ändern Sie Ihre Hilfsmethoden:
(Ich habe Sie geändert, die Methode, die Namen Folgen .NET-Konventionen und verwenden Sie die .NET-Terminologie für Veranstaltungen, die "gehoben" statt "fired up".)
Mr. Skeet immer gute Antworten. Hier habe ich eine weitere Lösung dessen, was Sie erklärte in der Frage.
Für diese beiden:
Mr. Skeet bereits beantwortet hat.
Für diese beiden:
Ihre
fireUpEvent
Methode wahrscheinlich nicht akzeptieren sollte eine arbritary Art der Stellvertretung als ein sprödes design. Aber es ist möglich zu tun.Die ultimative base type alle Delegierten-Typ in C# ist
Delegate
; eine Begrenzung derDelegate
ist, dass es nicht einewhere
Einschränkung bei generischen Typen und Methoden.Antwort auf die Frage(unabhängig von der in Bezug auf design), kann man sagen:
anstelle der ursprünglichen zwei Methoden in Frage, wo die
Target
ist das Objekt besitzt die Methode, behandelt würde, alsthis
,null
wenn es eine statische Methode.args
ist die Liste der Argumente übergeben an die Methode.Dies ist nur einer Weise, dass Sie es erreichen können, und ich bin mir ziemlich sicher, dass Mr. Skeet s Antwort ist absolut besser.