Как получить 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, Как бы я получить PropertyInfomember аналогично в приведенном ниже случае?

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 ответ

Решение

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

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

РЕДАКТИРОВАТЬ: хотя есть Array.Length свойство, это не то, что обычно используется. Например:

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

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

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

Другие вопросы по тегам