将表达式<Func <IBar,T >>转换为表达式<Func <Bar,T >>

tik*_*noa 3 c# linq lambda

你如何转换Expression<Func<IBar, T>>Expression<Func<Bar, T>>Bar实施IBar?

这个更通用的问题有答案:

将表达式<Func <T1,bool >>动态转换为Expression <Func <T2,bool>

这是这种情况下最好的方法吗?鉴于Bar实施IBar,有没有更简单的方法?

所以,鉴于这个人为的示例代码:

          public class Foo<T>
          {
                 private readonly List<T> _list = new List<T>();

                 public void Add(T item)
                 {
                       _list.Add(item);
                 }

                 public bool AnyFunc(Func<T, bool> predicate)
                 {
                       return _list.Any(predicate);
                 }

                 public bool AnyExpression(Expression<Func<T, bool>> expression)
                 {
                       return _list.AsQueryable().Any(expression);
                 }                    
          }

          public interface IBar
          {
                 string Name { get; }
          }

          public class Bar : IBar
          {
                 public string Name { get; set; }
          }
Run Code Online (Sandbox Code Playgroud)

这证明了这个问题:

          public class Test()
          {
                 private Foo<Bar> _foobar = new Foo<Bar>(); 

                 public void SomeMethodFunc(Func<IBar, bool> predicate)
                 {
                       // WILL COMPILE AND WORKS, casts from Func<IBar, bool> to Func<Bar, bool>
                       var found = _foobar.AnyFunc(predicate);
                 }

                 public void SomeMethodExpression(Expression<Func<IBar, bool>> expression)
                 {
                       // WON'T COMPILE - Can't cast from Expression<Func<IBar, bool>> to Expression<Func<Bar, bool>>  
                       var found = _foobar.AnyExpression(expression);
                 }
          }
Run Code Online (Sandbox Code Playgroud)

有什么想法我可以完成类似于SomeMethodExpression的东西吗?

Ami*_*ich 5

由于这种情况很简单,只与"投射"问题有关,因此有一个捷径:

public void SomeMethodExpression(Expression<Func<IBar, bool>> expression)
{
    Expression<Func<Bar, bool>> lambda = Expression.Lambda<Func<Bar, bool>>(expression.Body, expression.Parameters);
    var found = _foobar.AnyExpression(lambda);
}
Run Code Online (Sandbox Code Playgroud)