如何在.net 3.5中创建索引属性访问表达式?

时间:2011-11-15 10:21:24

标签: .net .net-3.5 properties expression expression-trees

在.NET 4.0中,可以编写如下内容:

ParameterExpression objExpr = Expression.Parameter(typeof(SomeIndexedType), "Obj");
ParameterExpression indexExpr = Expression.Parameter(typeof(int), "Index");
Expression indexAccessExpr = Expression.ArrayAccess(objExpr, indexExpr);

有没有办法在.NET 3.5中创建索引属性表达式?

2 个答案:

答案 0 :(得分:1)

类型的索引属性标有DefaultMemberAttribute属性。此属性是针对类/ struct / interface设置的。在C#中定义索引属性(例如public char this[int index])时,它将被赋予名称Item,但我认为这不是一个严格的规则。

现在,有关属性的有趣事情是你可以使用参数(甚至是getter)调用它们,所以一旦你获得了index属性的名称,你就可以执行Expression.Property。例如:

string defaultMember=GetDefaultPropertyName(typeof(SomeIndexType));
ParameterExpression indexExpr = Expression.Parameter(typeof(int), "Index");
Expression indexAccessExpr = Expression.Property(objExpr, defaultMember, indexExpr);

显然,您必须实施GetDefaultPropertyName才能使该属性脱离该类型。获得属性后,MemberName属性会告诉您需要访问哪个属性。

答案 1 :(得分:1)

使用方法get_Item:

var methodInfo = typeof(SomeIndexedType).GetMethod("get_Item");
Expression.Call(objExpr, methodInfo, ...