繁体   English   中英

C#将泛型类作为参数传递给自定义方法

[英]C# Passing Generic Class as a parameter to a custom Method

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

  1. 类类型-classType
  2. 页码-pageNum
  3. 页面大小-pageSize
  4. 按列排序-orderByColumn

下面是我要复制的函数的示例。

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

我不确定如何将classTypeorderByColumn传递给函数。

任何帮助将不胜感激。 谢谢

您根本不需要传递classType参数,因为使用GetDataPerPage<T>()方法时将声明类型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 ,但是如果您想控制比较的逻辑以使用类型为Tstring属性,则可以传递一个这样的代表:

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

您已经知道“类类型” ..它的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);

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM