gpt4 book ai didi

c# - 如何获取 ArrayLength 类型表达式的 MemberInfo?

转载 作者:太空宇宙 更新时间:2023-11-03 21:40:54 24 4
gpt4 key购买 nike

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”。有没有更好的办法?

最佳答案

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

它只是一个 UnaryExpression,带有一个 Operand(数组表达式)和一个 ArrayLengthNodeType。我不完全清楚你想知道什么,但希望对 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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com