protected T OnGetValue(int index) { IndexerValueGetter handler = GetValue; if (handler != null) { return(handler(this, index)); } throw new ListException("No ValueGetter set."); }
public ArrayIndexer1(IndexerValueGetter getter) { _getter = getter; }
private static void BuildValueGetters(Expression expression, IList <IValueGetter> list) { var memberExpression = expression as MemberExpression; if (memberExpression == null && expression is UnaryExpression) { memberExpression = ((UnaryExpression)expression).Operand 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); } }