如何将匿名对象指定为泛型参数?

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)

Jep*_*sen 6

我如何明确说明这种类型

你不能。匿名类型没有名称,因此不能明确提及。

如果您创建通用辅助方法,则可以推断匿名类型。在你的情况下,你可以这样做:

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将被自动推断。