C# 是表达式的集合<;Func<;T、 TProp>&燃气轮机;可能的

C# 是表达式的集合<;Func<;T、 TProp>&燃气轮机;可能的,c#,linq,generics,collections,expression,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) { }

鉴于此代码:

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)
    {

    }
}
然后在我的MVC视图中,通过一组列循环,并针对一个对象调用表达式,然而,由于TProp是在方法调用中推断出来的,因此它似乎不能存储为通用字段,例如

    private List<Expression<Func<T, TProp>>> columns = new List<Expression<Func<T, TProp>>>();
private List columns=new List();
有人能想出一种方法来解决这个问题而不使用对象或失去通用的好处吗

---编辑

我试着做两件事

首先,我将一个'SortBy'参数传递给我的控制器,它采用字符串属性的名称,当前通过((MemberExpression)expression.Member.name提取,其次我想使用Func在我的MVC视图中提取该字段的值


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

听起来好像您试图创建一个集合,其中每个实例都有不同的
TProp

这是不可能的

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

有关此技术的示例,请参阅my及其泛型。

之后您打算如何处理这些列?以后不能真正使用任何有关结果类型的编译时信息,因为它可能因调用而异:

AddColumn(x => x.SomeInt32Value);
AddColumn(x => x.SomeDateTimeValue);
如果这些要存储在同一个集合中,那么您必须强制转换或使用更通用的形式

您可能想考虑使用:

public void AddColumn(Expression<Func<T, object>> column)
public void AddColumn(表达式列)

就“源”类型而言,它仍然是安全的。。。您将失去“result”类型,但我认为这对您没有任何用处。

我会说
List
,但您认为这将失去泛型
TProp
的好处。你能详细说明一下吗?它有什么好处?回复:你的编辑:是;我以前做过。您需要一个非泛型接口集合,其中包含由泛型AddColumn方法创建的泛型实现。这将阻止您添加直接返回值类型的属性或函数(而不是传递自动装箱lambda).@SLaks:既然使用的是表达式树而不是委托,那么无论如何你都不能使用方法组转换。。。因此,只有在已经构建了其他表达式树的情况下,这才是一个问题。
public void AddColumn(Expression<Func<T, object>> column)