鉴于此代码:
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来对它们取出值。
答案 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。