是表达式的集合<func <t,tprop =“”>&gt;可能的?</FUNC <t时,>

时间:2012-07-31 13:32:50

标签: c# linq generics collections expression

鉴于此代码:

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'参数传递给我的Controller,它获取字符串属性的名称,当前通过((MemberExpression)表达式提取).Member.Name,其次我喜欢使用Func在我的MVC视图中提取该字段的值。

原因是我正在创建一个分页网格,我希望在控制器中使用一个很好的语法可配置列,例如我给出的AddColumn示例。我想查看Columns来创建标题行,然后在我的Models集合中循环遍历这些并调用Func来对它们取出值。

2 个答案:

答案 0 :(得分:2)

之后你想用的是什么?您之后无法真正使用有关结果类型的任何编译时信息,因为它可能因呼叫而异:

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

如果要将它们存储在同一个集合中,那么 <或em>要么使用来投射或使用更通用的表单。

您可能需要考虑使用:

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

就“源”类型而言,它仍然是安全的......你将失去“结果”类型,但我认为这对你没有用。

答案 1 :(得分:0)

听起来你正在尝试制作一个集合,其中每个实例都有不同的 TProp
这不是直接可能的。

相反,您可以创建实现非泛型接口的泛型类 然后,您可以创建非泛型接口的集合,并从泛型方法将泛型类的实例添加到集合中。

有关此技术的示例,请参阅我的ExcelExporter library及其通用SheetBase class