2015-05-30 4 views
0

Как создать и инициализировать следующий класс? В частности, я борюсь с TSortKey. Я думал, что это будет что-то вроде:Создание и инициализация общего класса

var p = new QueryParameters<Employees, e => e.LastName>(); // WRONG!! 

public class QueryParameters<T, TSortKey> where T : class 
{ 
    public int Page { get; set; } 
    public int PageSize { get; set; } 
    public string Filter { get; set; } 
    public Func<T, TSortKey> SortSelector { get; set; } 
    public bool Ascending { get; set; } 
} 

То, что я пытаюсь сделать, это заменить аргументы GetEmployees метод в коде ниже с QueryParameters объекта выше.

public QueryResults<Employees> GetEmployees<TSortKey>(int page, int pageSize, string filter, Func<Employees, TSortKey> sortSelector, bool asc) 
{ 

IEnumerable<Employees> query = Employees; 

if (filter != "*") 
{ 
    query = query.Where (e => e.LastName.StartsWith(filter)); 
} 

if (sortSelector != null) 
{ 
    query = asc ? query.OrderBy(sortSelector) : query.OrderByDescending(sortSelector); 
} 

var results = new QueryResults<Employees> 
{ 
    TotalItems = query.Count(), 
    Items = query.Skip((page - 1) * pageSize).Take(pageSize) 
}; 

return results; 
} 

public class QueryResults<T> where T : class { 
    public IEnumerable<T> Items { get; set; } 
    public int TotalItems { get; set; } 
} 

Я думаю, что я близкий, но я также могу оказаться в левом поле.

ответ

1

Вы немного в левом поле. В качестве общего параметра должны быть имена типов (классы, структуры, интерфейсы). Кажется, вы пытаетесь передать метод lamdba, который не является классом, структурой или интерфейсом, поэтому он не будет работать.

Что вы можете сделать, это:

var p = new QueryParameters<Employee, string>(); 
p.SortSelector = e => e.LastName; 
+0

Это сделал это !! Спасибо. Я просто мочу ноги, пытаясь принять более общий и функциональный подход к кодированию. На этом этапе я считаю, что более сложный для чтения и понимания примерный код выше. Я на правильном пути? –

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