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)
。我可以用这样的hack来做到这一点:
var member = (k.Body as UnaryExpression).Operand.Type.GetProperty("Length");
但这并不像直接表达方法。它更像是一个普通的旧反射调用,其中传递了肮脏的字符串“ Length”。有没有更好的办法?
最佳答案
这是一个ArrayLength
节点,您可以使用Expression.ArrayLength
方法创建该节点。
它只是带有数组形式的UnaryExpression
和Operand
的NodeType
的ArrayLength
。对我来说,尚不十分清楚您想知道什么,但是希望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/