【发布时间】:2011-05-10 12:27:35
【问题描述】:
我正在尝试构建具有不同输入参数类型的表达式字典。我正在尝试存储参数的类型,因为稍后我计划使用反射来发现该类型的方法。这是创建字典的代码和我创建的用于向其中添加条目的通用 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);
}
}
新方法的主体已正确创建。问题是当我尝试使用传入的表达式的类型创建新的 Lambda 表达式时,我收到此错误:
“TestNamespace.TestClass”类型的ParameterExpression不能用于“System.Type”类型的委托参数
有人知道我在这种情况下可以做什么吗?就像我之前说的,稍后我将遍历这本字典,对每个条目进行一些反思性编程。如果有更好的方法可以做到这一点,我会全力以赴。
作为我正在尝试做的一个示例,我为需要初始化的 POCO 对象存储 Where 子句的表达式:
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 方法是通用的,以便我在调用代码中使用 lambda 表达式。
谢谢, 杰森
【问题讨论】:
标签: linq generics reflection functional-programming expression-trees