2014-04-25 81 views
3

當Bar實現IBar時,如何將Expression<Func<IBar, T>>轉換爲Expression<Func<Bar, T>>將表達式<Func <IBar, T>>轉換爲表達式<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的東西嗎?

+0

你看着[AutoMapper(https://github.com/AutoMapper/AutoMapper)?根據你的用例,它的[QueryableExtensions](https://github.com/AutoMapper/AutoMapper/wiki/Queryable-Extensions)命名空間可以解決你的問題。但不能肯定地說,沒有看到你如何在非人爲的例子中使用'Func '。 –

+0

我不明白這個問題。根據你的代碼判斷,你似乎在說:「我這樣做,它是有效的,我做了這件事,而事實並非如此。」如果一種方法有效,爲什麼你會關心另一種方法? –

+0

@ LasseV.Karlsen:作品使用代表,另一個使用表達樹。 –

回答

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); 
} 
相關問題