如何获取 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
节点,您可以使用Expression.ArrayLength
方法创建。
它只是一个UnaryExpression
,带有数组表达式的Operand
和ArrayLength
的NodeType
。我并不完全清楚你想知道什么,但希望你对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
使用对属性的调用。