2017-01-20 6 views
1

J'ai le code comme ceci:Donner le nom court à la séquence Func <Type1, Type2> en 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; 

je ferais mieux avoir quelque chose comme:

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

ne peux pas comprendre comment pour ce faire avec Func. Je suis habitué aux délégués (où je n'ai pas eu ce problème car je peux donner un nom unique à un délégué) mais je n'arrive pas à comprendre comment répéter la même chose pour les déclarations Func. Je migre de la simple déclaration d'un type de délégué comme delegate Task StatusUpdateAsyncCallback(Request req, Response resp, byte[] data, string account, string alias) parce que je vais maintenant me fier à certaines capacités spécifiques à Func (par exemple, il est possible de faire une méthode d'extension qui fonctionnera pour tous les types de délégués Func avec certain nombre de paramètres alors que les types de délégués 'classiques' ne sont pas compatibles de cette manière). Si besoin plus d'informations à ce sujet, se trouve dans @ explications Mant101 à How to write extension method which will make invocation list members in multicast C# delegate run sequentially?

Répondre

4

Vous pouvez utiliser using (dans chaque fichier):

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

Tous les noms de type doivent être entièrement qualifiés.

2

Vous pouvez créer un alias de type à l'aide de using, bien qu'il ne s'applique qu'à ce fichier et non au reste de l'assemblage.

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

Oui, j'ai essayé cela en premier lieu mais ça n'a jamais marché. Après votre suggestion, je l'ai essayée encore mais obtenant toujours le 'type ou l'espace de noms que Func n'a pas pu trouver'. J'ai essayé avec un plus petit nombre de paramètres (comme 'using StatusUpdateAsyncCallback = Func ;'). Mais oh mon seigneur, je l'ai finalement fonctionné, il s'avère que le nom de type complet System.Func est toujours nécessaire, l'utilisation de System au début de la source ne suffit pas. – Alex

+0

Les alias de type @Alex nécessitent toujours des noms de type complets. Ils sont indépendants de toute autre utilisation qui pourrait être présente. – Kyle

0

au moins pour le même fichier source, cela fonctionne:

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

Le point clé est de toujours fournir les noms de type complet dans l'utilisation de la directive (System.Func, System.Threading.Tasks.Task). Les précédentes déclarations using System.Threading.Tasks et using System n'ont aucun effet.