Mat*_*ero 4 .net c# generics lambda
假设我有以下任务:
var task = _entityManager.UseRepositoryAsync(async (repo) =>
{
IEnumerable<Entity> found = //... Get from repository
return new
{
Data = found.ToList()
};
}
Run Code Online (Sandbox Code Playgroud)
的类型是task什么?
实际上,结果是:System.Threading.Tasks.Task<'a>,
'a匿名类型在哪里:{ List<object> Data }
如何在不使用的情况下明确说明这种类型var?
我已经尝试过Task<a'> task = ...,Task<object> task = ...但无法对其进行编译。
我有一个方法 ( UseApplicationCache<T>),它将 aFunc<Task<T>>作为参数。
我还有一个cache用户可能设置为trueor的变量false。
如果true,则应调用上述方法并将 mytask作为参数传递,如果false,则应执行 mytask而不将其作为方法的参数。
我的最终结果是这样的:
Func<Task<?>> fetch = () => _entityManager.UseRepositoryAsync(async (repo) =>
{
IEnumerable<Entity> found = //... Get from repository
return new { Data = found.ToList() };
}
return await (cache ? UseApplicationCache(fetch) : fetch());
Run Code Online (Sandbox Code Playgroud)
我如何明确说明这种类型
你不能。匿名类型没有名称,因此不能明确提及。
如果您创建通用辅助方法,则可以推断匿名类型。在你的情况下,你可以这样做:
static Func<TAnon> InferAnonymousType<TAnon>(Func<TAnon> f)
{
return f;
}
Run Code Online (Sandbox Code Playgroud)
有了这个,你可以这样做:
var fetch = InferAnonymousType(() => _entityManager.UseRepositoryAsync(async (repo) =>
{
IEnumerable<Entity> found = //... Get from repository
return new { Data = found.ToList() };
}
));
return await (cache ? UseApplicationCache(fetch) : fetch());
Run Code Online (Sandbox Code Playgroud)
的“值”TAnon将被自动推断。