Как получить выражение 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
используется вызов свойства.