使用表达式树

时间:2015-08-10 16:42:43

标签: c# .net expression-trees

假设我有这样的类型:

class Context
{
    SomeType[] Items { get; set; }
}

我希望能够使用表达式树访问特定的Items元素。假设我需要索引为0的元素。我可以像下面这样做,一切都按预期工作:

var type = typeof (Context);
var param = Expression.Parameter(typeof (object));
var ctxExpr= Expression.Convert(param, context);    
var proInfo = type.GetProperty("Items");

Expression.ArrayIndex(Expression.Property(ctxExpr, proInfo), Expression.Constant(0));

如果我将上下文类型更改为包含提供List<SomeType>的.NET,而不是array,即

class Context
{
    List<SomeType> Items { get; set; }
}

相同的表达式导致以下错误:

  

System.ArgumentException:参数必须是数组   System.Linq.Expressions.Expression.ArrayIndex(Expression数组,   表达式索引)

我的问题是,如何编写可以在List<>或更好的索引下访问项目的相应表达式,以及任何声明索引器的集合?例如。有没有办法检测,并使用表达式树将这样的集合转换为适当类型的array

1 个答案:

答案 0 :(得分:2)

索引器实际上只是一个带有额外参数的属性,因此您需要:

var property = Expression.Property(ctxExpr, proInfo);
var indexed = Expression.Property(property, "Item", Expression.Constant(0));

其中"Item"indexed property的名称。

(如果您事先不知道该属性的名称,它通常是 <{em> Item,但您可以通过反射找到它,方法是查找带有索引器参数的所有属性。)< / p>