1

鉴于此代码:

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”参数传递给我的控制器,它采用字符串属性的名称,当前通过 ((MemberExpression)expression).Member.Name 提取,其次我想使用Func 在我的 MVC 视图中提取该字段的值。

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

4

2 回答 2

2

之后你想用这些列做什么?稍后您不能真正使用有关结果类型的任何编译时信息,因为它可能因调用而异:

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

如果这些要存储在同一个集合中,则无论如何您必须强制转换或使用更通用的形式。

您可能要考虑使用:

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

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

于 2012-07-31T13:36:08.733 回答
0

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

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

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

于 2012-07-31T13:35:17.013 回答