@stcmd04236

Как создать обобщение для списка лямда выражений?

Всем доброго дня! Пытаюсь создать обобщение для создания списка лямбда выражений. Но что то не так. Как дальше вызвать эти выражения?

Абстрактный класс:

public abstract class AbstractExpressionList<T>
    {
        protected Dictionary<string, Expression<Func<T, T>>> list;
        
        public AbstractExpressionList()
        {
            this.list = new Dictionary<string,Expression<Func<T, T>>>();
        }

        public void Add(string key, Expression<Func<T, T>> expression)
        {
            if (Exist(key))
                throw new Exception(string.Format("Duplicate expression from field {0}", key));

            list.Add(key, expression);
        }

        public abstract T Execute(string key);

        public Expression<Func<T, T>> Get(string key)
        {
            return list[key];
        }

        public bool Exist(string key)
        {
            return list.Count(l=>l.Key.Equals(key)) > 0;
        }        

        public void Remove(string key)
        {
            list.Remove(key);
        }

        public void Replace(string key, Expression<Func<T, T>> expression)
        {
            list[key] = expression;
        }
    }


Из этого создал следующий класс:

public class IQueryableExpressionList : AbstractExpressionList<IQueryable>
    {
        public override IQueryable Execute(string key, bool isAscending)
        {
                  /*Как здесь сделать реализацию?*/
        }
    }
  • Вопрос задан
  • 164 просмотра
Пригласить эксперта
Ответы на вопрос 1
impwx
@impwx
Разработчик
Во-первых, вы можете унаследоваться от Dictionary и не переизобретать методы:

class AbstractExpressionList<T>: Dictionary<string, Func<T, T>> { }

Во-вторых, ваш метод Execute уже написан авторами LINQ и называется Enumerable.Aggregate. Внутри он устроен примерно так:

public T Aggregate(IEnumerable<T> values, T accumulator, Func<T, T> projection)
{
    var current = accumulator;
    foreach(var value in values)
        current = projection(current, value);
    return current;
}

Вам понадобится начальное значение, от которого цикл будет двигаться. Можете использовать первый элемент в списке, или default(T), или передавать пользовательское значение.

Поскольку ваш класс будет унаследован от Dictionary, который в свою очередь реализует IEnumerable, то вы можете использовать Aggregate напрямую, не реализовывая самостоятельно:

var data = new AbstractExpressionList<T>
{
    ["a"] = ...,
    ["b"] = ...
};
var result = data.Aggregate(...);
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы