更好的搜索DTO设计

时间:2014-02-10 12:31:50

标签: c# asp.net generics design-patterns

如何制作可用作任何搜索模板的通用SearchDTO

它应该有任何过滤器和其他一般信息,如TotalRecords,Sort Order,Pages,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”(您是否缺少using指令或程序集引用?)。

我如何指定像退出List of any objects一样,我可以创建其他属性,如

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

除此之外还有其他最佳方法来解决这个问题吗?

3 个答案:

答案 0 :(得分:1)

您需要在班级中指定T作为类型参数:

public abstract class SearchDTO<T>

然后当你继承它时 - 你应该提供具体的类型而不是类型参数:

public class EmployeeSearchDTO : SearchDTO<MyConcreteType>

或后继类也应该是通用的:

public class EmployeeSearchDTO<T> : SearchDTO<T>

答案 1 :(得分: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必须在继承的类中声明为abstract和override。

EmployeeSearchDTOP代码

public class EmployeeSearchDTO:SearchDTO<Employee>
{

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

创建Employee课程并移动FirstName&amp; Employee类中的LastName属性。

员工类

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

 }

答案 2 :(得分: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;
}