问题
Some trouble with UnaryExpression
s.
This works this way:
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;
In the above case the k.Body.NodeType
was ExpressionType.Convert
. But it's a little tricky with ExpressionType.ArrayLength
. How would I get the PropertyInfo
member
similarly in the below case?:
Expression<Func<string[], int>> k = l => l.Length;
var member = ??
In the second case k.Body
is something like ArrayLength(l)
.
I can do it with a hack like this:
var member = (k.Body as UnaryExpression).Operand.Type.GetProperty("Length");
but this doesn't feel like a straight forward expression approach. It's more a plain old reflection call with dirty string "Length" passed. Is there a better way?
回答1:
It's an ArrayLength
node, which you can create with the Expression.ArrayLength method.
It's just a UnaryExpression
with an Operand
which is the array expression, and a NodeType
of ArrayLength
. It's not entirely clear to me what you wanted to know about it, but hopefully the call to Expression.ArrayLength
is what you were after.
EDIT: Although there is an Array.Length property, that's not what's used normally. For example:
int[] x = new int[10];
Array y = x;
int a = x.Length;
int b = y.Length;
... then evaluating x.Length
uses the ldlen
IL instruction whereas evaluating y.Length
uses a call to the property.
来源:https://stackoverflow.com/questions/19336342/how-to-get-memberinfo-of-arraylength-type-expressions