2017-01-20 2 views
1

У меня есть такой код:Дать краткое имя Func <Type1, Type2> последовательности в 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; 

Я бы лучше иметь что-то вроде:

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

не могу понять, как сделать это с помощью Func. Я привык к делегатам (где у меня не было этой проблемы, так как я могу дать уникальное имя любому делегату), но теперь не могу понять, как повторить то же самое для объявлений Func.

Я перехожу от простого объявления типа делегата, такого как delegate Task StatusUpdateAsyncCallback(Request req, Response resp, byte[] data, string account, string alias), потому что теперь я буду полагаться на некоторые специфичные для Func способности (например, можно создать метод расширения, который будет работать для всех видов делегатов Func с определенное количество параметров, тогда как «классические» типы делегатов несовместимы таким образом). Если нужно больше информации по этому вопросу можно найти в @ Mant101 объяснений на How to write extension method which will make invocation list members in multicast C# delegate run sequentially?

ответ

4

Вы можете использовать using (в каждом файле):

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

Все имена типов должны быть полностью квалифицированным.

2

Вы можете создать псевдоним типа с помощью using, хотя он будет применяться только в этом файле, а не в остальной части сборки.

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

Да, я действительно пытался это сделать, но это никогда не получилось. После вашего предложения я попробовал еще раз, но все еще получаю: «Тип или пространство имен Func не удалось найти». Я также пытался с меньшим количеством параметров (например, 'using StatusUpdateAsyncCallback = Func ;'). Но, о мой господин, я наконец-то работал, получается полное имя типа System.Func всегда необходимо, использование System в начале источника недостаточно. – Alex

+0

@ Алиасы типа Alex всегда требуют полнотелых имен типов. Они не зависят от других приемов, которые могут присутствовать. – Kyle

0

По крайней мере, для того же исходного файла, это будет работать:

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

Ключевым моментом является то, чтобы всегда предоставлять полные имена типов при помощи директивы (System.Func, System.Threading.Tasks.Task). Ранее объявления using System.Threading.Tasks и using System не влияют.