【发布时间】:2018-12-14 22:05:53
【问题描述】:
我需要以编程方式识别索引器何时出现在表达式中,但生成的表达式树不是我所期望的。
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 是“调用”,methodName 是“get_Item”。为什么? expression.Body 不应该等同于Expression.Property( Expression.Constant( this ), "Item", Expression.Constant( 0 ) ) 吗?这正是我所期望的。
我需要能够以非常通用的方式检测索引器 - 几乎可以给出任何表达式。这种对预期表达树的破坏损害了我这样做的能力。依赖方法名称为“get_Item”太脆弱了。另外,IndexerNameAttribute 可能已被用于重命名索引器属性。
那么有没有办法让编译器生成预期的表达式树?请不要建议手动构建表达式,因为这不是一个选项。或者有什么方法可以以编程方式确保我拥有的是索引器?
【问题讨论】:
-
I need to programmatically recognize when an indexer occurs within an expression你确定吗?因为并非所有 .NET 语言都具有称为索引器的构造。这就是在内部创建方法 get_Item 的原因。如果从 VB.NET 调用您的代码,您会期望发生什么? -
@nvoigt VB.NET 有 多个 索引器,我希望我的代码也能识别它们。那么对于确实有索引器的语言,为什么编译器不生成
IndexExpression?缺少索引器的语言对这个问题有多重要?我认为重要的是底层反射模型包括索引属性,如 Property.GetValue 所示。
标签: c# linq-expressions indexed-properties