2012-07-31 87 views
1

鑑於這種代碼:是否可能表達<Func <T, TProp>>的集合?

public class PaginationModel<T> : BaseModel 
{ 
    public List<T> Rows { get; set; } 

    public PagingInfo PagingInfo { get; set; } 

    public void AddColumn<TProp>(Expression<Func<T, TProp>> column) 
    { 

    } 
} 

我希望能夠通過列的集合使用代碼

leadListOutputModel.AddColumn(x => x.DateCreated); 

然後在我的MVC視圖循環,並調用針對的對象表達,但是因爲TProp是在方法調用中推斷出來的,所以它似乎無法存儲爲通用字段,例如

private List<Expression<Func<T, TProp>>> columns = new List<Expression<Func<T, TProp>>>(); 

任何人都可以想到一個解決方法,而不使用對象或失去通用的好處嗎?

---編輯

我試圖做兩件事情,

首先,我傳遞過「SortBy」 paramater我控制器這需要字符串的屬性名稱,目前正在通過((MemberExpression)表達式).Member.Name提取,其次我想使用Func在我的MVC視圖中提取該字段的值。

原因是我正在做一個分頁的網格,我想在控制器中使用一個很好的語法來配置列,比如我給的AddColumn示例。我想查看Columns來創建標題行,然後在我的Models集合中循環遍歷這些行,然後調用Func來提取值。

+1

我想說'List >>',但是您建議失去一個通用'TProp'的好處。你能詳細說明一下嗎?它有什麼好處? – hvd 2012-07-31 13:35:55

+0

Re:你的編輯:是的;我以前做過。您需要一組非通用接口,並使用泛型AddColumn方法創建泛型實現。 – SLaks 2012-08-02 15:55:47

回答

0

這聽起來像你正在試圖做一個集合,其中每個實例有一個不同TProp
這不是直接可能的。

而是,您可以製作實現非通用接口的泛型類。
然後,您可以創建非通用接口的集合,並將通用類的實例從通用方法添加到集合中。

有關此技術的示例,請參閱我的ExcelExporter library及其通用SheetBase class

2

你想要與列之後?你真的不能使用有關結果類型的任何編譯時的信息後,因爲它可以改變從電話撥打:

AddColumn(x => x.SomeInt32Value); 
AddColumn(x => x.SomeDateTimeValue); 

如果這些都將被存儲在同一個集合中,你會無論如何都可以投射或使用更一般的形式。

你可能要考慮使用:

public void AddColumn(Expression<Func<T, object>> column) 

它仍然會在「源」類型方面的安全...你會失去了「結果」的類型,但我不認爲無論如何,這將對你有用。

+0

這會阻止您添加直接返回值類型的屬性或函數(與傳遞自動裝箱lambda相反)。 – SLaks 2012-07-31 13:37:47

+1

@SLaks:好吧,由於它使用表達式樹而不是委託,所以您無法使用方法組轉換...因此,如果您已經構建了其他表達式樹,那隻會是一個問題。 – 2012-07-31 13:38:56

+0

查看編輯即將到來.. – 2012-07-31 13:40:52

相關問題