假设我有这样的类型:
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
?
答案 0 :(得分:2)
索引器实际上只是一个带有额外参数的属性,因此您需要:
var property = Expression.Property(ctxExpr, proInfo);
var indexed = Expression.Property(property, "Item", Expression.Constant(0));
其中"Item"
是indexed property的名称。
(如果您事先不知道该属性的名称,它通常是 <{em> Item
,但您可以通过反射找到它,方法是查找带有索引器参数的所有属性。)< / p>