如何获得ArrayLength类型的表达式的MemberInfo?(How to get Membe

2019-10-18 18:25发布

一些麻烦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");

但这并不觉得自己是一个直接的表达方式 。 它更像是一个普通的老电话反映脏串“长度”过去了。 有没有更好的办法?

Answer 1:

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

这只是一个UnaryExpressionOperand ,其是阵列表达,和一个NodeTypeArrayLength 。 这并不完全清楚,我想要的东西,以了解它,但希望调用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使用该属性的调用。



文章来源: How to get MemberInfo of ArrayLength type expressions?