如何将表达式从类型接口转换为特定类型

时间:2012-05-30 15:21:23

标签: c# interface lambda type-conversion expression

在我的界面中,我有以下定义的

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

我的问题在哪里?

3 个答案:

答案 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;
}