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