C#将Generic Class作为参数传递给自定义方法

时间:2013-12-12 03:58:46

标签: c# asp.net asp.net-mvc generics

我正在尝试创建一个可以接受以下参数的通用函数。

  1. 班级类型 - classType
  2. 页码 - pageNum
  3. 页面大小 - pageSize
  4. 按列排序 - orderByColumn
  5. 以下是我正在尝试复制的功能示例。

     public List<T> GetDataPerPage<T>(IList<T> classType, int pageNum, int pageSize, string orderByColumn)
           {
            if (pageSize <= 0) pageSize = 10;  // TODO: Default pageSize for the Moment
            if (pageNum <= 0) pageNum = 1;
            int excludedRows = (pageNum - 1) * pageSize;
    
            return GetRepo<classType>().All(null).AsQueryable().Where(p => p.IsDeleted == false).OrderBy(p => p.orderByColumn).Skip(excludedRows).Take(pageSize).ToList();                                  
        }
    

    我不确定它应该如何将 classType orderByColumn 传递给函数。

    非常感谢任何帮助。感谢

2 个答案:

答案 0 :(得分:2)

您根本不需要传递classType参数,因为在使用T方法时会声明类型GetDataPerPage<T>(),因此请将其更改为:

public List<T> GetDataPerPage<T>(int pageNum, int pageSize, string orderByColumn)
{
    if (pageSize <= 0) pageSize = 10;  // TODO: Default pageSize for the Moment
    if (pageNum <= 0) pageNum = 1;
    int excludedRows = (pageNum - 1) * pageSize;

    return GetRepo<T>().All(null)
                       .AsQueryable()
                       .Where(p => p.IsDeleted == false)
                       .OrderBy(p => p.orderByColumn)
                       .Skip(excludedRows)
                       .Take(pageSize)
                       .ToList();                                  
}

对于orderByColumn参数,如果您要像您的示例那样进行比较,那么传入string就可以了,但如果您想控制比较的逻辑使用string类型的T属性,然后传递这样的委托:

public List<T> GetDataPerPage<T>(int pageNum, int pageSize, Func<T, string> orderBy)
{
    if (pageSize <= 0) pageSize = 10;  // TODO: Default pageSize for the Moment
    if (pageNum <= 0) pageNum = 1;
    int excludedRows = (pageNum - 1) * pageSize;

    return GetRepo<T>().All(null)
                       .AsQueryable()
                       .Where(p => p.IsDeleted == false)
                       .OrderBy(orderBy)
                       .Skip(excludedRows)
                       .Take(pageSize)
                       .ToList();                                  
}

用法:

var list = GetDataPerPage<T>(pageNum, pageSize, p => p.Property1);

答案 1 :(得分:1)

您已经知道“班级类型”.. T

GetRepo<T>().All(null)...

对于OrderBy ..自己传递给代表:

public List<T> GetDataPerPage<T>(IList<T> classType, 
                                 int pageNum, 
                                 int pageSize, 
                                 Func<T, object> orderBy)
{
    ...

    return ... ... .OrderBy(orderBy)
}

并像这样传递代表:

GetDataPerPage(..., ..., ..., x => x.SomePropertyHere);