Я пытаюсь создать словарь выражений с разными типами входных параметров. Я пытаюсь сохранить тип параметра, потому что позже я планирую использовать Reflection, чтобы обнаружить метод для типа. Вот код, который создает словарь и универсальную функцию Add, которую я создал для добавления в него записей:
public class LoadEntityQuery : IQuery<LoadEntityQueryResult>
{
public IDictionary<Type, Expression<Func<Type, bool>>> Entities { get; set; }
public LoadEntityQuery()
{
Entities = new Dictionary<Type, Expression<Func<Type, bool>>>();
}
public void Add<T>(Expression<Func<T, bool>> where = null) where T : Entity
{
Expression<Func<Type, bool>> _lambda = null;
if (where != null)
{
ParameterExpression param = Expression.Parameter(typeof(T), where.Parameters[0].Name);
var body = Expression.Invoke(where, param);
_lambda = Expression.Lambda<Func<Type, bool>>(body, param);
}
Entities.Add(typeof(T), _lambda);
}
}
Тело нового метода создано правильно. Проблема в том, что когда я пытаюсь создать новое лямбда-выражение с типом из передаваемого выражения, я получаю эту ошибку:
ParameterExpression типа TestNamespace.TestClass нельзя использовать для параметра делегата типа System.Type.
У кого-нибудь есть идея, что я могу сделать в этой ситуации? Как я уже говорил, в какой-то момент позже я пройдусь по этому словарю, чтобы выполнить рефлексивное программирование для каждой записи. Если есть лучший способ сделать это, я весь внимание.
В качестве примера того, что я пытаюсь сделать, я храню выражения для предложений Where для объектов POCO, которые необходимо инициализировать:
LoadEntityQuery _query = new LoadEntityQuery();
_query.Add<PayrollLocation>();
_query.Add<PayrollGroupBU>();
_query.Add<PersonnelPosition>(t => t.DataSet == MasterDataSet);
_query.Add<EmployeeStatus>();
_query.Add<PayrollGrade>();
Этот список сущностей будет отличаться для каждого приложения. Идея состоит в том, чтобы собрать все сущности и предложение Where для каждой и найти определенный метод, используя отражение для каждой из них. (например, PayrollLocation имеет метод GetPayrollLocationsQuery(), PayrollGroupBU имеет метод GetPayrollGroupBUQuery()...). Метод Add является универсальным, чтобы я мог использовать лямбда-выражение в вызывающем коде.
Спасибо, Джейсон