如何获取ArrayLength类型表达式的MemberInfo?

时间:2013-10-12 16:05:44

标签: c# expression-trees memberinfo

UnaryExpression的一些问题。

这种方式这样:

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.NodeTypeExpressionType.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");

但这并不像是一种直截了当的表达方法。它更像是一个普通的旧反射调用,通过了脏字符串“Length”。还有更好的方法吗?

1 个答案:

答案 0 :(得分:4)

这是一个ArrayLength节点,您可以使用Expression.ArrayLength方法创建该节点。

只有一个UnaryExpression Operand是数组表达式,NodeTypeArrayLength。我并不完全清楚你想知道的是什么,但希望Expression.ArrayLength的电话是你所追求的。

编辑:虽然 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则使用对该属性的调用。