在我的界面中,我有以下定义的
List<IFoo> GetListOfFoo<T>(Expression<Func<T, bool>> predicate) where T : IFoo;
在我的实现中,我将以特定类型转换表达式:
if (typeof(T) == typeof(Foo))
{
Expression converted = Expression.Convert(predicate.Body, typeof(Foo));
Expression<Func<Foo, bool>> newPredicate =
Expression.Lambda<Func<Foo, bool>>(converted, predicate.Parameters);
}
我尝试使用我的实现:
Expression<Func<Foo, bool>> predicate = c => c.Name == "Myname";
_repository.GetListOfFoo<Foo>(predicate);
我没有编译错误,但如果我使用它,我会得到一个异常,即ExpressionBody中定义的bool参数。
我的问题在哪里?
答案 0 :(得分:1)
您的代码没有任何意义。
您正在创建一个返回Expression.Convert
的{{1}},然后尝试将其用作返回Foo
的函数。
bool
也没有意义;您无法将Expression.Convert
转换为bool
。
你可能正在尝试写
Foo
只要var converted = (Expression<Func<Foo, bool>>) predicate;
为T
,就可以正常使用。
答案 1 :(得分:0)
参数的类型需要更改,而不是表达式的主体。
从您的实施中调用后,您必须进行转换。
为什么你需要Foo : IFoo
。
答案 2 :(得分:0)
我找到了更好的解决方案。我不需要自己编译谓词。
public List<IFoo> GetFoos<T>(Expression<Func<T, bool>> predicate) where T : class, IModel
{
var result = new List<IFoo>();
var repository = new Repository<T>();
result.AddRange(repository.GetEntities(predicate).ToList().ConvertAll(c => (IFoo)c));
return result;
}