式内でインデクサーが発生するタイミングをプログラムで認識する必要がありますが、結果の式ツリーは期待したものではありません。
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
とにかくインデクサー プロパティの名前を変更するために使用された可能性があります。
とにかく、コンパイラに意図した式ツリーを生成させる方法はありますか? 式を手動で作成することはオプションではないため、提案しないでください。または、私が持っているものがインデクサーであることをプログラムで確認する方法はありますか?