2017-01-20 2 views
1

ich Code wie dieses:Geben Sie kurze Namen Func <Typ1, Typ2> Sequenz in C#

private Func<Request, Response, byte[], string, string, Task> _started; 
private Func<Request, Response, byte[], string, string, Task> _progress; 
private Func<Request, Response, byte[], string, string, Task> _completed; 
private Func<Request, Response, byte[], string, string, Task> _errorOccurred; 
private Func<Request, Response, byte[], string, string, Task> _cancelled; 

ich besser haben so etwas wie:

typedef Func<Request, Response, byte[], string, string, Task> StatusUpdateAsyncCallback; // in C++ way. 
private StatusUpdateAsyncCallback _started; 
// and so on. 

nicht herausfinden kann, wie um dies mit Func zu tun. Ich bin an Delegaten gewöhnt (wo ich dieses Problem nicht hatte, da ich jedem Delegierten einen eindeutigen Namen geben kann), aber jetzt kann ich nicht herausfinden, wie ich dasselbe für Func-Deklarationen wiederholen soll.

Ich bin von der einfachen Erklärung eines Delegattyp wie delegate Task StatusUpdateAsyncCallback(Request req, Response resp, byte[] data, string account, string alias) migrieren, weil ich jetzt auf einige Func spezifische Fähigkeiten verlassen werden (zum Beispiel ist es möglich, eine Erweiterungsmethode zu machen, die für alle Arten von Func Delegierten arbeiten mit bestimmte Anzahl von Parametern, während "klassische" Delegiertypen auf diese Weise nicht kompatibel sind.

using StatusUpdateAsyncCallback = 
     System.Func<Request, Response, byte[], string, string, System.Threading.Tasks.Task>; 

Alle Typnamen sollte voll qualifiziert: Wenn Sie weitere Informationen über diese benötigt werden, können in @ Mant101 Erklärungen bei How to write extension method which will make invocation list members in multicast C# delegate run sequentially?

Antwort

4

Sie using (in jeder Datei) können gefunden werden.

2

Sie können einen Typalias mithilfe von using erstellen, obwohl dies nur für diese Datei gilt, nicht für den Rest der Assembly.

using StatusUpdateAsyncCallback = 
    System.Func<Request, Response, byte[], string, string, System.Threading.Tasks.Task>; 
+0

Ja, das habe ich zuerst versucht, aber es hat nie geklappt. Nach Ihrem Vorschlag habe ich es erneut versucht, aber immer noch 'Type oder Namespace Func konnte nicht gefunden werden'. Ich probierte auch mit einer kleineren Anzahl von Parametern (wie 'using StatusUpdateAsyncCallback = Func ;'). Aber oh mein Herr, ich habe es endlich funktioniert, es stellt sich heraus, dass der volle Typ Name System.Func immer benötigt wird, die Verwendung von System am Anfang der Quelle ist nicht genug. – Alex

+0

@Alex Typ-Aliase erfordern immer vollständig qualifizierte Typnamen. Sie sind unabhängig von anderen Anwendungen, die vorhanden sein könnten. – Kyle

0

Mindestens für die gleiche Quelldatei, wird diese Arbeit:

using StatusUpdateAsyncCallback = System.Func<Request, Response, byte[], string, string, System.Threading.Tasks.Task>; 

Der entscheidende Punkt ist immer Namen volle Art in Direktive zur Verfügung zu stellen (System.Func, System.Threading.Tasks.Task). Frühere using System.Threading.Tasks und using System Erklärungen haben keine Wirkung.

Verwandte Themen