2014-10-16 5 views
1

У меня есть эта функциональность:Тип вывода в лямбдах

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.

Как это сделать?

ответ

1

Либо компилятор может вывести все параметры типа, либо указать их все. Но вы можете явно указать тип аргумента лямбда-выражения, такие как:

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

Я не знал, что смогу сделать это с лямбдами. Спасибо! Мне не нравится синтаксис использования, но я думаю, что это единственный возможный способ. Это действительно работает. –

3

это дело выключатель с точки зрения API

затем рассмотреть ваше дело сломана ... Вы можете» t частично вывести общие параметры. Если хранилище был родовым вы могли бы сделать:

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); 

Но я не знаю, если это изменение возможно для вас.

+0

+1, хорошо сказано. :) –

+0

Это не общий, мне нравится это лучше, я чувствую, что это позволяет более простое использование. Спасибо за ответ, я сделаю +1, но возьму другой, поскольку он работает в моей архитектуре (хотя мне не нравится синтаксис использования). И почему они не выполняют частичный вывод? Это явно имеет смысл, по крайней мере, в этом случае. –

+0

@ h.alex Потому что это стоит денег, чтобы проектировать, строить, тестировать и отправлять функции. Команда C# весит преимущества функции по сравнению с затратами и взвешивает ее с учетом других запрошенных функций. До сих пор кажется, что пособие не стоит затрат. Также см. [Этот ответ] (http://stackoverflow.com/a/6878596/1081897) для другого мнения. –

Смежные вопросы