0

次のようにしましょう。

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);、例として呼び出します。

私は今から 1 週間苦労していますが、この瞬間まで受け取ったエラーがどれほど多様であったかをお伝えしたくありません。誰かがデリゲートに対応するブロックとラムダ式を書くことができますが、ex: Method.Call に深く入り込むことはできませんか? 表情だけにこだわる!?

ありがとうございました!

4

1 に答える 1

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

param2 つの式の「マージ」は、2 つの式のうちの 2 つが「異なる」ため、常に少し複雑です。それらは同じではありません(一方がで、もうparam一方が であるようなものです)。ここでは、最初の式の最初のパラメーターを「新しい」式と他の式のパラメーターとして再利用することで解決します。param1param2Expression.Invoke

不正行為がなければ、

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

ここで、新しいパラメーターを導入しparExpression.Invoke他の 2 つの式を導入します。

Entity Framework は をサポートしていないことに注意してくださいExpression.Invoke。この場合、パラメーター リライター (このようなもの) を使用できます。

于 2013-08-30T09:42:38.493 に答える