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)

我可以用这样的hack来做到这一点:

var member = (k.Body as UnaryExpression).Operand.Type.GetProperty("Length");


但这并不像直接表达方法。它更像是一个普通的旧反射调用,其中传递了肮脏的字符串“ Length”。有没有更好的办法?

最佳答案

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

它只是带有数组形式的UnaryExpressionOperandNodeTypeArrayLength。对我来说,尚不十分清楚您想知道什么,但是希望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使用对该属性的调用。

关于c# - 如何获取ArrayLength类型表达式的MemberInfo?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/19336342/

10-09 06:00