2013-10-12 3 views
1

Некоторые проблемы с UnaryExpression s.Как получить MemberInfo из выражений типа ArrayLength?

Это работает так:

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. Но это немного сложно с . Как бы я получить 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"); 

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

ответ

4

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

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

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

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

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

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

+0

Я хочу знать, как получить 'PropertyInfo' из свойства' Length' из 'l.Length' части выражения. Как получить это из метода Expression.ArrayLength? – nawfal

+0

@nawfal: Это не свойство, поэтому там * нет * такой 'PropertyInfo'. –

+0

Я думаю, это свойство. Например, я могу получить 'PropertyInfo' типичного' int []. Length 'like' typeof (int []). GetProperty («Длина») '. – nawfal