How can I cast an expression from type interface,

2019-05-30 14:51发布

In my interface I have following defined

List<IFoo> GetListOfFoo<T>(Expression<Func<T, bool>> predicate) where T : IFoo;

In my implementation I'll cast the expression in the specific type:

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);
}

I try to use my implementation like this:

Expression<Func<Foo, bool>> predicate = c => c.Name == "Myname";
_repository.GetListOfFoo<Foo>(predicate);

I get no compiling errors, but if I use this, I get an Exception that in the ExpressionBody is the bool argument defined.

Where is my problem?

3条回答
爷的心禁止访问
2楼-- · 2019-05-30 15:36

The parameter's type need to change, not the body of the expression.

Upon invocation from your implementation, you would have to do the conversion.

Also does not make sense why you need this as Foo : IFoo.

查看更多
老娘就宠你
3楼-- · 2019-05-30 15:42

Your code doesn't make any sense.

You're creating an Expression.Convert that returns a Foo, then trying to use that as a function that returns a bool.

The Expression.Convert also doesn't make sense; you can't convert a bool to a Foo.

You're probably trying to write

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

As long as T is Foo, this will work fine.

查看更多
爱情/是我丢掉的垃圾
4楼-- · 2019-05-30 15:50

I found a better solution. I don't need to cast the predicate themselves.

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;
}
查看更多
登录 后发表回答