1

在我的界面中,我定义了以下内容

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 参数。

我的问题在哪里?

4

3 回答 3

1

你的代码没有任何意义。

您正在创建一个Expression.Convert返回 aFoo的函数,然后尝试将其用作返回 a 的函数bool

Expression.Convert也没有意义;你不能将 a 转换bool为 a Foo

你可能正在尝试写

var converted = (Expression<Func<Foo, bool>>) predicate;

只要TFoo,这将正常工作。

于 2012-05-30T15:26:31.793 回答
0

参数的类型需要改变,而不是表达式的主体。

从您的实现调用后,您必须进行转换。

也没有道理为什么你需要这个作为Foo : IFoo.

于 2012-05-30T15:42:17.950 回答
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;
}
于 2012-05-31T06:18:04.400 回答