如何创建ToJsonAsync扩展方法?

时间:2017-01-10 13:31:47

标签: c# json serialization async-await

我创建一个将Obj转换为Json的扩展方法:

 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;
    }

使用后显示此错误:

  

&#39;串&#39;不包含&#39; GetAwaiter&#39;的定义没有扩展方法&#39; GetAwaiter&#39;接受类型&#39; string&#39;的第一个参数。可以找到(你错过了使用指令或程序集引用吗?)

alson在Task<string>中使用ToJsonAsync时 显示此错误:

  

无法隐式转换类型&#39;字符串&#39; to&#39; System.Threading.Tasks.Task&#39;

1 个答案:

答案 0 :(得分: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()也没有产生等待结果。您需要执行以下操作:

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

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

然后,您将首先await使用异步I / O的任务,然后当该任务完成后,通过调用您的扩展方法完成您的任务。

(由于扩展方法本身并不涉及此异步性,因此它可能只被称为ToJson())。