Как получить выражение MemberInfo из выражений типа ArrayLength?

Некоторые проблемы с UnaryExpression s.

Это работает следующим образом:

Expression<Func<List<string>, object>> k = l => l.Count;
//got member in this case like this
var member = ((k.Body as UnaryExpression).Operand as MemberExpression).Member;

В приведенном выше случае k.Body.NodeType был ExpressionType.Convert. Но это немного сложно с ExpressionType.ArrayLength. Как мне получить PropertyInfo member аналогично в следующем случае?:

Expression<Func<string[], int>> k = l => l.Length;
var member = ??

Во втором случае k.Body есть что-то вроде ArrayLength(l).

Я могу сделать это с помощью взлома:

var member = (k.Body as UnaryExpression).Operand.Type.GetProperty("Length");

, но это не похоже на прямой подход к выражению. Это более простой старый звонок с грязной струной "Длина". Есть ли лучший способ?

Ответы

Ответ 1

Это a ArrayLength node, который вы можете создать с помощью метода Expression.ArrayLength.

Это просто a UnaryExpression с Operand, которое является выражением массива, и NodeType of ArrayLength. Мне не совсем понятно, что вы хотели знать об этом, но, надеюсь, призыв к Expression.ArrayLength - это то, что вам нужно.

EDIT: хотя есть свойство Array.Length, это не то, что обычно используется. Например:

int[] x = new int[10];
Array y = x;

int a = x.Length;
int b = y.Length;

... тогда оценка x.Length использует команду ldlen IL, тогда как при оценке y.Length используется вызов свойства.