private static void buildValueGetters(Expression expression, IList <IValueGetter> list) { var memberExpression = expression as MemberExpression; if (memberExpression != null) { var propertyInfo = (PropertyInfo)memberExpression.Member; list.Add(new PropertyValueGetter(propertyInfo)); if (memberExpression.Expression != null) { buildValueGetters(memberExpression.Expression, list); } } //deals with collection indexers, an indexer [0] will look like a get(0) method call expression var methodCallExpression = expression as MethodCallExpression; if (methodCallExpression != null) { var methodInfo = methodCallExpression.Method; Expression argument = methodCallExpression.Arguments.FirstOrDefault(); if (argument == null) { var methodValueGetter = new MethodValueGetter(methodInfo, new object[0]); list.Add(methodValueGetter); } else { object value; if (TryEvaluateExpression(argument, out value)) { var methodValueGetter = new MethodValueGetter(methodInfo, new object[] { value }); list.Add(methodValueGetter); } } if (methodCallExpression.Object != null) { buildValueGetters(methodCallExpression.Object, list); } } if (expression.NodeType == ExpressionType.ArrayIndex) { var binaryExpression = (BinaryExpression)expression; var indexExpression = binaryExpression.Right; object index; if (TryEvaluateExpression(indexExpression, out index)) { var indexValueGetter = new IndexerValueGetter(binaryExpression.Left.Type, (int)index); list.Add(indexValueGetter); } buildValueGetters(binaryExpression.Left, list); } }
protected bool Equals(IndexerValueGetter other) => DeclaringType == other.DeclaringType && Index == other.Index;
protected bool Equals(IndexerValueGetter other) { return(_arrayType == other._arrayType && Index == other.Index); }
protected bool Equals(IndexerValueGetter other) { return _arrayType == other._arrayType && Index == other.Index; }
public ArrayIndexer(IndexerValueGetter getter) { _getter = getter; }