Я пытаюсь создать словарь выражений, которые имеют разные типы входных параметров.Я пытаюсь сохранить тип параметра, потому что позже я планирую использовать 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 является общим для того, чтобы я использовал лямбда-выражение в вызывающем коде.
Спасибо, Джейсон