1

私は機能を持っています:

public void Execute(Expression<Action> expression)
{
    var time = expression.Compile().Benchmark();

    var msg = string.Format("{0} took {1} to complete",
        ReflectionHelper.GetComponentCallDetails().ToString(),
        time.ToString(@"hh\:mm\:ss\.ff"));

    Logger.Info(msg);
}

呼び出す必要のあるデリゲートは次のようなものです。

channels = GetAllChannelsImpl(maxResults);

私は式ツリーに比較的慣れていないので、アクションデリゲートをメソッドに渡す方法を理解できません。

私はを使用して同じ機能を行うことができました

public void Execute(Action action)
{
    var time = action.Benchmark();

    var msg = string.Format("{0} took {1} to complete",
        ReflectionHelper.GetComponentCallDetails().ToString(),
        time.ToString(@"hh\:mm\:ss\.ff"));

    Logger.Info(msg);
}

と呼び出す

Execute(() =>
{
    channels = GetAllChannelsImpl(maxResults);
});

しかし、リフレクションのオーバーヘッドを使用して、それをログに記録するために呼び出されたメソッドの詳細を把握する必要をなくすために、式ツリーベースのアプローチを使用したかったのです。

上記のアクションデリゲートの式ツリーをメソッドパラメータとして渡す正しい方法を誰かが提案できますか?

4

1 に答える 1

2

ラムダ式自体には型がありません。実際に使用するタイプは、割り当てまたはキャストしようとしているものに応じて、コンパイラーによって推測されます。そうは言っても、ラムダはまたはExecute()として互換性があるため、単純なラムダを使用したメソッドの呼び出しはあいまいになります。期待するタイプに明示的にキャストすることで、これを明確にする必要があります。ActionExpression<Action>

// assign to a variable
Expression<Action> action1 = () => ...;
Execute(action1);

// cast
Execute((Expression<Action>)(() => ...));

// use the constructor
Execute(new Expression<Action>(() => ...));

あいまいなオーバーロードを削除し、メソッドの1つを名前変更することをお勧めします。式のオーバーロードの名前をに変更することをお勧めしExecuteExpression()ます。

于 2012-05-31T03:49:47.610 に答える