6

関数からボディを取得するにはどうすればよいですか

Func<bool> methodCall = () => output.SendToFile(); 

if (methodCall())
    Console.WriteLine("Success!");

output.SendToFile()これを文字列として取得する必要があります

もう一つの例:

string log = "";

public void Foo<T>(Func<T> func)
{
    try
    {
        var t = func();
    }
    catch (Exception)
    {
        //here I need to add the body of the lambda
        // log += func.body;
    }
}

public void Test()
{
    var a = 5;
    var b = 6;
    Foo(() => a > b);
}

編集: このトピックの詳細については、次を参照してください:式ツリー

4

1 に答える 1

11

できません。AFunc<T>は簡単に分析できるものではありません。ラムダを分析したい場合は、 を作成しExpression<Func<bool>>て分析する必要があります。

式の本体を取得するのは簡単です:

Expression<Func<bool>> methodCall = () => output.SendToFile(); 
var body = methodCall.Body;

bodyさらに分析したり、MethodCallExpressionを介して出力したりできますToString。を使用ToStringしても、希望どおりになるわけではありませんが、その情報も含まれています。

たとえば、LINQPadToString()で onを実行するとbody、次のようになります。

value(UserQuery+<>c__DisplayClass0).output.SendToFile()

ご覧のとおり、"output.SendToFile()"あります。

式で定義されたコードを実際に実行するには、まずそれをコンパイルする必要があります。

var func = methodCall.Compile();
func();

これは次のように短縮できます。

methodCall.Compile()(); // looks strange but is valid.
于 2013-07-16T10:15:54.243 に答える