我需要以编程方式识别索引器何时出现在表达式中,但生成的表达式树不是我所期望的。
class IndexedPropertiesTest
{
static void Main( string[] args ) { new IndexedPropertiesTest(); }
public string this[int index]
{
get { return list[index]; }
set { list[index] = value; }
}
List<string> list = new List<string>();
public IndexedPropertiesTest()
{
Test( () => this[0] );
}
void Test( Expression<Func<string>> expression )
{
var nodeType = expression.Body.NodeType;
var methodName = ((MethodCallExpression)expression.Body).Method.Name;
}
}
在上面的代码中,nodeType
是“Call”并且methodName
是“get_Item”。为什么?不expression.Body
应该等同于Expression.Property( Expression.Constant( this ), "Item", Expression.Constant( 0 ) )
? 这就是我所期望的。
我需要能够以非常通用的方式检测索引器 - 几乎可以给出任何表达式。这种对预期表达树的破坏损害了我这样做的能力。依赖方法名称为“get_Item”太脆弱了。另外,IndexerNameAttribute
无论如何可能已用于重命名索引器属性。
那么有没有办法让编译器生成预期的表达式树?请不要建议手动构建表达式,因为这不是一个选项。或者有什么方法可以以编程方式确保我拥有的是索引器?