mock.Raiseの最初の議論の背後にある意味は何ですか?私はラムダだと認識していますが、Moqがイベントにnull EventHandlerを追加しようとするラムダをなぜ必要とするのかは不明です。Moqの "m => m.FooEvent + = null"の使用はどういう意味ですか?
// Raising an event on the mock
mock.Raise(m => m.FooEvent += null, new FooEventArgs(fooValue));
mock.Raiseの最初の議論の背後にある意味は何ですか?私はラムダだと認識していますが、Moqがイベントにnull EventHandlerを追加しようとするラムダをなぜ必要とするのかは不明です。Moqの "m => m.FooEvent + = null"の使用はどういう意味ですか?
// Raising an event on the mock
mock.Raise(m => m.FooEvent += null, new FooEventArgs(fooValue));
我々はそのRaiseメソッドを使用してモックオブジェクトからイベントを発生させます。この は2つのパラメータを受け入れます。最初は、イベントを発生させる空のイベント加入者である を含むラムダ式です。 最も洗練された構文ではありませんが、これはMoqにイベントの使用方法を理解させるために必要です。 2番目のパラメータは、イベントに含まれるイベント引数 を提供します。
出所:here。
我々はmoq source codeでRaiseメソッドを見ていきます場合は、それは署名だが、次のようになります。
public void Raise(Action<T> eventExpression, EventArgs args);
それは我々が(リフレクションを使用して)上げしたいイベントを識別するためにAction<T>
を使用します、我々は、使用して、このイベントを指定します何らかの種類の代理人(Action<T>
)に評価されるラムダ式。
優れた構文意志のようなものになります。
mock.Raise(m => m.FooEvent, new FooEventArgs(fooValue));
をしかし、このラムダが、それはAction<T>
ないため、コンパイル私たちのラムダと同等である。この方法を考えてみません:
public void Baz(SomeMock m)
{
m.FooEvent;
}
それはです署名が有効であるようですが、入力があり、出力がありません。Action<T>
BUTこのメソッドはコンパイルされません。 t(または任意のプロパティ)を何も操作せずに(set、getなど)、C#構文ではサポートされていません。なぜなら、この理由のためにmoqライターは代替を探す必要があり、nullイベントこのラムダをコンパイルできるようにする回避策として、ハンドラ登録:
m.FooEvent += null
私は+最初の引数は式ツリーであると定義しているクラスの外のイベントに使用できる唯一の使用量は(追加または削除事業者を経由していることを推測します=/- =)。 Moqはおそらく、イベントアクセスの式ツリーを分析するだけで、デリゲートが実際に気にしないので、nullは問題ありません。 –
ああそれはそれほどではありません。これは表現木ではなく、Moqがコールグラフを解析できるように内部の偽装が渡されたが、主な点は依然として立つ標準的なデリゲートではありません。この種の追加/削除操作は、宣言型以外のイベントを使用する唯一の正当な方法です。 –
@mikezそれも私の最初の考えでした。しかし、引数は 'Expression'ではなく' Action 'であるので、そうではないようです。 –
Rob