2012-05-25 81 views
0

我有一些方法:轉換表達<Func鍵<TModel的,IList的<TItem> >>以表達<Func鍵<TModel的,IEnumerable的>>

public void Foo(Expression<Func<TModel, IEnumerable>> expression) { 
    // foo 
} 

,我有變量:

Expression<Func<TModel, IList<TItem>>> expression; 

我如何可以將我的變量傳遞給Foo

+0

有** **很多努力。看到我自己的問題[這裏](http://stackoverflow.com/q/2797261/50079);閱讀至少[我的答案](http://stackoverflow.com/a/10467736/50079)(因爲接受的答案不回答你的問題的最重要部分)*和*評論。我不會把它標記爲一個愚蠢的東西,而是讓你決定。 – Jon

回答

4

你有你的表達變量轉換:

var exp = Expression.Lambda<Func<TModel, IEnumerable>>(expression.Body, expression.Parameters); 
Foo(exp); 
+0

將轉換爲Expression >時會出現InvalidCastException。沒有通過將LambdaExpression傳遞給Foo將導致編譯器錯誤。 – Dennis

+0

@ Dennis我的解決方案不使用強制轉換,因此它的工作原理沒有錯誤。 –

+0

我的不好。我錯過了使用泛型重載'Expression.Lambda'。 – Dennis

1

使用此:

public Expression<Func<TModel, IEnumerable>> ConvertExpression<TModel, TItem>(Expression<Func<TModel, IList<TItem>>> expression) 
    { 
     return (Expression<Func<TModel, IEnumerable>>)Expression 
      .Lambda(Expression.Convert(expression.Body, typeof(IEnumerable)), expression.Parameters); 
    } 
相關問題