如何获取 ArrayLength 类型表达式的成员信息

本文关键字:表达式 类型 成员 员信息 ArrayLength 何获取 获取 | 更新日期: 2023-09-27 18:35:01

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

但这感觉不像是一种直截了当的表达方法。这更像是一个普通的旧反射调用,带有脏字符串"长度"传递。有没有更好的方法?

如何获取 ArrayLength 类型表达式的成员信息

它是一个

ArrayLength节点,您可以使用Expression.ArrayLength方法创建。

它只是一个UnaryExpression,带有数组表达式的OperandArrayLengthNodeType。我并不完全清楚你想知道什么,但希望你对Expression.ArrayLength的呼唤是你所追求的。

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

int[] x = new int[10];
Array y = x;
int a = x.Length;
int b = y.Length;

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