2017-01-10 5 views
-1

я создать метод расширения, который Преобразовать Obj Для Json:Как создать метод расширения ToJsonAsync?

public static class JsonExtention 
{ 
    public static string ToJsonAsync(this object initialTags) 
    { 

     return new JavaScriptSerializer().Serialize(initialTags); 
    } 
} 

теперь я хочу использовать это в другой метод:

public async Task<IList<SkillViewModel>> GetAllSkillAsync() 
    { 
     var ViewModel = 
      _mapper.Map<IList<Skill>, IList<SkillViewModel>>(source: await _skills.AsNoTracking().ToListAsync.ToJsonAsync()); 

     return ViewModel; 
    } 

После использования Показать ошибку:

'string' does not contain a definition for 'GetAwaiter' and no extension method 'GetAwaiter' accepting a first argument of type 'string' could be found (are you missing a using directive or an assembly reference?)

alson При использовании Task<string> в ToJsonAsync показать эту ошибку:

Cannot implicitly convert type 'string' to 'System.Threading.Tasks.Task'

+0

'ToJsonAsync' звучит как его неназванное имя, так как оно не возвращает« Задача ». –

+0

@ danielA.white Да, я делаю эту работу, но показываю ошибку –

ответ

2

Старшинство await ниже . Поэтому часть кода:

await _skills.AsNoTracking().ToJsonAsync() 

эквивалентно:

var thing = _skills.AsNoTracking().ToJsonAsync(); 
await thing; 

Если вы хотите эквивалент:

var thing = await _skills.AsNoTracking(); 
thing.ToJsonAsync() 

Используйте круглые скобки, чтобы исправить заказ:

(await _skills.AsNoTracking()).ToJsonAsync() 

Но это еще не совсем там, как AsNoTracking() не производит awaitable результат либо. Вам нужно сделать что-то вроде:

(await _skills.AsNoTracking().ToListAsync()).ToJsonAsync() 

или

(await _skills.AsNoTracking().FirstOrDefaultAsync()).ToJsonAsync() 

Тогда вы будете первым await задачи, которая использует асинхронную I/O, а затем, когда эта задача будет выполнена, закончить свою задачу по телефону ваш метод расширения на нем.

(Поскольку метод расширения сам по себе не связан с этой асинхронностью, его следует, вероятно, просто называть ToJson()).

+0

Я не думаю, что мы знаем, что 'AsNoTracking' возвращает' Задача '. Вероятно, OP просто хочет сделать «ToJsonAsync» реальным асинхронным методом, по крайней мере, на основе имени. – juharr

+0

@juharr Я уверен, что это EF, и он определенно не возвращает 'Task '. Я только что исправил это. –

+0

Да, это имеет смысл. – juharr

Смежные вопросы