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

标签 c# .net generics lambda

假设我有以下任务:

var task = _entityManager.UseRepositoryAsync(async (repo) => 
{
    IEnumerable<Entity> found = //... Get from repository

    return new 
    {
        Data = found.ToList()
    };
}

task 的类型是什么? ?

实际上,结果是:System.Threading.Tasks.Task<'a> ,

哪里'a是匿名类型:{ List<object> Data }

如何在不使用 var 的情况下明确声明此类型?

我试过了Task<a'> task = ...Task<object> task = ...但无法对其进行编译。

为什么我需要这样做?

我有一个方法(UseApplicationCache<T>),需要一个Func<Task<T>>作为参数。

我还有一个变量 cache用户可能会设置为 truefalse .

如果true ,上面说的方法应该被调用,我的task如果false,应作为参数传递,我应该执行我的 task而不将其作为方法的参数。

我的最终结果是这样的:

Func<Task<?>> fetch = () => _entityManager.UseRepositoryAsync(async (repo) =>
{
     IEnumerable<Entity> found = //... Get from repository
     return new { Data = found.ToList() };
}

return await (cache ? UseApplicationCache(fetch) : fetch());

最佳答案

How can I explicitly state this type

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

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

static Func<TAnon> InferAnonymousType<TAnon>(Func<TAnon> f)
{
  return f;
}

这样你就可以做到:

var fetch = InferAnonymousType(() => _entityManager.UseRepositoryAsync(async (repo) =>
{
     IEnumerable<Entity> found = //... Get from repository
     return new { Data = found.ToList() };
}
));

return await (cache ? UseApplicationCache(fetch) : fetch());

TAnon 的“值”将被自动推断。

关于c# - 如何将匿名对象指定为泛型参数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32909980/

相关文章:

c# - 不同文化的日期时间转换

.net - 如何在 MVC 4 中使用 NHaml?

linq - 具有其他类型泛型 Func 参数的扩展方法

c# - 检查用户是域用户还是本地用户

c# - mvc4 下拉列表中的枚举值

c# - ASP.NET MVC 下拉列表未选择值

c# - 以编程方式将程序集安装到 GAC

C#继承问题

c# - 流畅的接口(interface) : Avoid Excessive Parameters On Generic Types

java - 如何解决 Java 通用通配符限制