在.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中创建索引属性表达式?
答案 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, ...