Мне нужно программно распознать, когда индексир встречается внутри выражения, но результирующее дерево выражений не то, что я ожидал.Признать индексатора в выражении LINQ
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
, возможно, использовался для переименования свойства indexer.
Так или иначе, чтобы получить компилятор для генерации целевого дерева выражений? Не предлагайте вручную создавать выражение, поскольку это не вариант. Или есть ли способ программно убедиться, что у меня есть индекс?
'Мне нужно программно определить, когда индексатор происходит внутри expression' вы уверены? Потому что не все языки .NET даже имеют конструкцию, называемую индексом. Вот почему метод get_Item создается внутри. Что бы вы ожидали, если ваш код вызывается из VB.NET? – nvoigt
@nvoigt VB.NET имеет * несколько указателей *, которые я бы хотел, чтобы мой код также распознал. Итак, для langauges, у которых * есть * есть индексы, почему компилятор не генерирует «IndexExpression»? Каким образом языки, у которых нет указателей, важны для этого вопроса? Я думаю, что важно то, что основная модель отражения включает индексированные свойства, как показано на [Property.GetValue] (https://msdn.microsoft.com/en-us/library/b05d59ty.aspx). – HappyNomad