在lambda中输入推断

时间:2014-10-16 22:17:40

标签: c# generics types inference

我有这个功能:

 public class Repository : IRepository
    {
        public List<TEntity> GetOrdered<TEntity, TSortKey>(Func<TEntity, TSortKey> orderBy, int take, params string[] includePaths) where TEntity : AbstractEntity
        {
            var query = (from ent in this.Context.Set<TEntity>() select ent).IncludePaths(includePaths);

            return query.OrderBy(orderBy).Take(take).ToList();
        }
    }    

要调用它:

List<Project> p = repository.GetOrdered<Project, string>(x => x.Name, 10);

我希望在调用时不需要给它第二个通用参数,从API的角度来看它是一个交易破坏者。

怎么做?

2 个答案:

答案 0 :(得分:3)

  从API的角度来看,这是一个交易破坏者

然后考虑你的交易被破坏......你无法部分推断通用参数。如果您的存储库是通用的,您可以这样做:

 public class Repository<TEntity> : IRepository<TEntity> where TEntity : AbstractEntity
{
    public List<TEntity> GetOrdered<TSortKey>(Func<TEntity, TSortKey> orderBy, int take, params string[] includePaths) 
    {
        var query = (from ent in this.Context.Set<TEntity>() select ent).IncludePaths(includePaths);

        return query.OrderBy(orderBy).Take(take).ToList();
    }
}  

然后做

List<Project> p = repository.GetOrdered(x => x.Name, 10);

但我不知道你是否有可能做出改变。

答案 1 :(得分:1)

编译器可以推断所有类型参数,或者您必须全部指定它们。但是您可以显式指定lambda表达式的参数类型,例如:

List<Project> p = repository.GetOrdered((Project x) => x.Name, 10);