我创建一个将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;
答案 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()
)。