2014-02-10 3 views
0

Как создать общий SearchDTO который может быть использован как шаблон для любого поиска?Улучшенный поиск DTO Design

Он должен иметь любой фильтр и другую общую информацию, как TotalRecords, сортировку, страница Start Row и т.д.

public abstract class SearchDTO 
{ 
    public object Id { get; set; } 
    public IList<T> SearchResults { get; set; } 
    public int PageSize { get; set; } 
    public int StartRowNo 
    { 
     get 
     { 
      return (CurrentPage - 1) * PageSize; 
     }   
    } 
    public int CurrentPage { get; set; } 
} 

И любой поиск объект выглядит.

public class EmployeeSearchDTO:SearchDTO 
{ 
    public string FirstName { get; set; } 
    public string LastName { get; set; } 
} 

Но я получаю следующее сообщение об ошибке в IList<T> собственности:

Тип или пространство имен «T» не может быть найден (вы пропали без вести с помощью директивы или ссылка на сборку?).

Как я мог указать, как returing в List of any objects и я могу создать другое свойство, как

public long TotalRecords 
{ 
    get 
    { 
     return SearchResults.Count; 
    } 
    set; 
} 

есть ли лучший подход, кроме этого, чтобы решить эту проблему?

ответ

0

До тех пор, пока не существует конкретная причина для вас использовать абстрактный класс, что вы хотите, может быть достигнуто просто с помощью шаблонного класса:

public class SearchDTO<T> 
{ 
    public object Id { get; set; } 
    public IList<T> SearchResults { get; set; } 
    public int PageSize { get; set; } 
    public int StartRowNo 
    { 
     get 
     { 
      return (CurrentPage - 1) * PageSize; 
     } 
    } 
    public int CurrentPage { get; set; }  
} 

Для создания объекта все, что вам нужно сделать, это:

SearchDTO<EmployeeSearchDTO> obj=new SearchDTO<EmployeeSearchDTO>(); 

И вместо того, чтобы SearchResults собственности создать функцию, которая будет возвращать список EmployeeSearchDTO объектов, например:

public IList<T> SearchResults() 
{ 
    IList<T> listObj=new List<T>(); 
    //your code here 
    return listObj; 
} 
+0

Почему добытчик и сеттеры не работают? Внутренне все геттеры будут преобразованы в методы. Ваш подход не подходит для моего дела. – Billa

+0

Вы также можете использовать свойство, это не имело бы значения. Но в такой ситуации, когда вам нужен только геттер, нужно предпочесть использовать функцию. Таким образом, вы решили отправить некоторые параметры для поиска, вы могли бы это сделать. Если вы хотите использовать абстрактный класс, то два подхода, предложенные Сергеем и Цзинешем, верны. –

1

Вы должны указать T в качестве параметра типа на классе:

public abstract class SearchDTO<T> 

Тогда, когда вы будете наследовать от него - вы должны либо предоставить конкретный тип вместо параметра типа:

public class EmployeeSearchDTO : SearchDTO<MyConcreteType> 

или преемника класс должен быть также общим:

public class EmployeeSearchDTO<T> : SearchDTO<T> 
1

Вам также потребуется объявление на классе, знать, что T типа:

кода для абстрактного класса

public abstract class SearchDTO<T> 
{ 
    public object Id { get; set; } 
    public abstract IList<T> SearchResults { get; set; } 
    public int PageSize { get; set; } 
    public int StartRowNo 
    { 
     get 
     { 
      return (CurrentPage - 1) * PageSize; 
     }   
    } 
    public int CurrentPage { get; set; }  
} 

IList<T> SearchResults должен объявить как абстрактные и переопределить в унаследованном классе.

Код EmployeeSearchDTOP

public class EmployeeSearchDTO:SearchDTO<Employee> 
{ 

    public override IList<Employee> SearchResults { get; set; } 
} 

Создать Employee класс и двигаться FirstName & LastName свойства в классе Employee.

класса Сотрудник

public class Employee 
{ 
    public string FirstName {get; set; } 
    public string LastName {get;set;} 

} 
+0

Вы скомпилировали этот код? Dont вы получите ту же ошибку 'Тип или имя пространства имен 'T' не удалось найти (вам не хватает директивы using или ссылки на сборку?)'? – Billa

+0

обновленный код! нет ошибки компиляции. –

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