2013-12-12 55 views
2

我試圖創建一個通用函數,該函數可以接受以下參數。C#將通用類作爲參數傳遞給自定義方法

  1. 類的類型 - classType所
  2. 頁碼 - 頁次
  3. 頁大小 - 的pageSize
  4. 排序列 - orderByColumn

下面是一個例子我正在嘗試的功能g複製。

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的功能。

任何幫助將不勝感激。由於

回答

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

謝謝@Simon Whitehead。我得到的類只能通過在末尾添加T:class **來添加,否則T將返回編譯錯誤。 'Public list GetDataPerPage (Func whereClause,Func orderByClause,int pageNum,int pageSize)其中T:class'。我使用了_Func orderBy_作爲函數中的where子句,因爲它可能會從類更改爲類,但它不接受whereBy子句。 –

+0

這是我從where子句中得到的錯誤''System.Linq.IQueryable '不包含'Where'和最佳擴展方法重載定義'System.Linq.ParallelEnumerable.Where (System.Linq.ParallelQuery ,系統。Func )'有一些無效的參數' –

+0

嗨@SimonWhitehead,我通過傳遞參數作爲'Func ' –

2

您不需要通過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); 
+0

謝謝@卡爾安德森。我刪除_IList classType_並在函數的末尾添加了'where T:class'並接受實體。我爲where子句創建了一個'Func '參數,但是在嘗試傳入'p => p.IsDeleted == false'時會中斷。我通過將其更改爲'Func '進行了更正。 **如果只接受一個布爾值,你將如何通過類似的SQL語句傳遞給函數?** –

+0

@pchannon - 我原本使用'Func '回答了這個問題,但是因爲您在'OrderBy()'函數,那麼它不需要是一個'字符串'?我以爲你想要選擇你想要排序的域對象的屬性,還是我不正確? –

+0

是的,我想。該函數應該看起來像這樣嗎? 'public list GetDataPerPage (Func whereClause,Func orderByClause,int pageNum,int pageSize)其中T:class if(pageSize <= 0)pageSize = 10; // TODO:Moment 的默認pageSize if(pageNum <= 0)pageNum = 1; int excludedRows =(pageNum - 1)* pageSize; ()).OrderBy(orderByClause).Skip(excludedRows).Take(pageSize).ToList();返回GetRepo ().All(null).AsQueryable } –

相關問題