2013-08-30 44 views
0

讓我們有以下幾點:Expression.Block方法給出了在C#中不同的錯誤

Func<string, int> counterOfChar = (myString) => { 
     Console.WriteLine("Here is my parameter "+myString); 
     return myString.Count(); 
}; 

我希望把這裏涉及的所有表達式,定義他們如此:

Expression<Action<string>> first = (param) => Console.WriteLine("Here is my parameter "+param); 
Expression<Func<string, int>> second = (param) => param.Count(); 

然後調用Expression.Block(first, second);舉個例子 。

我現在掙扎了一個星期,我不想告訴你直到現在這個時候收到的錯誤是多麼的多樣。 有人可以爲代表編寫相應的Block和lambda表達式,但不會深入到前:Method.Call?只要堅持表達!

謝謝!

回答

2
Expression<Action<string>> first = (param) => Console.WriteLine("Here is my parameter " + param); 
Expression<Func<string, int>> second = (param) => param.Length; // .Count() is useless here! 

Expression<Func<string, int>> third = 
    Expression.Lambda<Func<string, int>>(
     Expression.Block(first.Body, 
          Expression.Invoke(second, first.Parameters[0])), 
     first.Parameters[0]); 

var f = third.Compile(); 
var r1 = f("Hello"); 

「合併」兩種表達總是有點複雜,因爲兩個表達式的兩個param是「不同」。他們是不一樣的param(它就像一個是param1,另一個是param2)。在這裏,我們通過重用第一個表達式的第一個參數作爲「new」表達式的參數並將另一個表達式的參數解決。

沒有作弊,我們可以有

var par = Expression.Parameter(typeof(string)); 

Expression<Func<string, int>> third = 
    Expression.Lambda<Func<string, int>>(
     Expression.Block(
      Expression.Invoke(first, par), 
      Expression.Invoke(second, par)), 
     par); 

var f = third.Compile(); 
var r1 = f("Hello"); 

,我們引入一個新的參數par,我們Expression.Invoke其他兩個表達式。請注意,實體框架不支持Expression.Invoke。在這種情況下,您可以使用參數重寫器(類似於this。)

+0

它在這裏說避免評論爲:謝謝...等。 –

+0

我已經標記爲答案,但我不能upvote,我需要更多的聲譽。答案正是我需要的。 –

相關問題