将 Expression<Func<IBar, T>> 转换为 Expression<Func<Bar, T>>。

3
如何将实现了IBar的Bar类型中的Expression<Func<IBar, T>>转换为Expression<Func<Bar, T>>
针对这个问题,以下是更加通用的解决方案: Convert Expression<Func<T1,bool>> to Expression<Func<T2,bool> dynamically 在此情况下,这是否是最佳方法?考虑到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; }
          }

这是一个示例,说明了问题:
          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);
                 }
          }

有什么想法可以实现类似于SomeMethodExpression的功能吗?

你看过AutoMapper吗?根据你的使用情况,它的QueryableExtensions命名空间可能会解决你的问题。但是如果没有看到你如何在非人为示例中使用Func<Foo, T>,就不能确定。 - Scott Chamberlain
我不理解这个问题。根据你的代码,似乎你是在说“我做了这个,它有效。我做了另一件事,它无效。”如果一个方法有效,为什么还要担心另一个方法呢? - Lasse V. Karlsen
@LasseV.Karlsen:那个可行的使用委托,另一个使用表达式树。 - Wiktor Zychla
你没有理解我的评论/问题。你说的是:a可以使用,但b不能。为什么你不能使用a呢? - Lasse V. Karlsen
1个回答

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接