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.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");
但这并不像是一种直截了当的表达方法。它更像是一个普通的旧反射调用,通过了脏字符串“Length”。还有更好的方法吗?
答案 0 :(得分:4)
这是一个ArrayLength
节点,您可以使用Expression.ArrayLength
方法创建该节点。
只有一个UnaryExpression
Operand
是数组表达式,NodeType
是ArrayLength
。我并不完全清楚你想知道的是什么,但希望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
则使用对该属性的调用。