1

s的一些麻烦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”。有没有更好的办法?

4

1 回答 1

4

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

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

编辑:虽然有一个属性Array.Length但这不是通常使用的。例如:

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

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

...然后评估x.Length使用ldlenIL 指令,而评估y.Length使用对属性的调用。

于 2013-10-12T16:07:52.667 回答