渡戻り値を戻り、EventHandler
-
22-07-2019 - |
質問
Imうに書きるAPIおよびI電話をする必要があり、eventhandlerのようなデータを表示します。のようなこと:
public override bool Run(Company.API api)
{
SomeInfo _someInfo = new SomeInfo();
if (_someInfo.Results == 1)
return true;
else
return false;
using (MyTable table = new MyTable(api))
{
table.WhenData += new EventHandler<DataEventArgs<Record>>(table_WhenData);
table.WhenDead += new EventHandler<EventArgs>(table_WhenDead);
table.Start();
}
public void table_WhenData(object sender, DataEventArgs<Record> e)
{
return true;
}
ことさんはあまりないと思いますかパスの戻り値からtable_WhenDataので通過してしまいます。
久試みた多くの方法(くようなパス_someInfoの方法なんだと思いる構文です。
駐日アンゴラ共和国大使館特命全ですぞよろしくお願い申し上げます。
解決
共通パターンなどの返還データからのイベントハンドラが追加物件のイベントの引数オブジェクトでは、消費者のイベントできるプロパティを設定する呼び出し側ができます。これは非常に共通UIの取り扱いコードきない場合はキャンセルイベント概念のこと。
次の疑似コード、コンパイルします。その目的は、表示パターンです。
public MyEventArgs : EventArgs
{
public bool Cancel{get;set;}
}
public bool fireEvent()
{
MyEventArgs e=new MyEventArgs();
//Don't forget a null check, assume this is an event
FireEventHandler(this,e);
return e.Cancel;
}
public HandleFireEvent(object sender, MyEventArgs e)
{
e.Cancel=true;
}
編集
ように頼んだような---Jon Skeet意す:の EventArgs
mutuable.は、消費者のイベントの変更ができるの状態 EventArgs
オブジェクトをダブルオーライザーのイベントがこのデータです。
他のヒント
これは古い投稿であることは知っていますが、万が一それに出くわした場合に備えて、これを行うことは確かに可能です。値を返す独自のデリゲートを宣言し、この新しいデリゲートからイベントを作成します。次に例を示します。
イベント宣言者/発行者:
// the delegate
public delegate string ReturnStringEventHandler(object sender, EventArgs args);
// the event
public event ReturnStringEventHandler StringReturnEvent;
// raise the event
protected void OnStringReturnEvent(EventArgs e)
{
if (StringReturnEvent != null) // make sure at least one subscriber
// note the event is returning a string
string myString = StringReturnEvent(this, e);
}
イベントサブスクライバー:
// Subscribe to event, probably in class constructor / initializer method
StringReturnEvent += HandleStringReturnEvent;
// Handle event, return data
private string HandleStringReturnEvent(object sender, EventArgs e)
{
return "a string to return";
}
.NETは、ResembeEventHandlerデリゲートを使用してデータ(この場合は目的のアセンブリへの参照)を返すAssemblyResolveイベントでこの例を提供します。 AssemblyResolveイベントに関するMSDN記事
AssemblyResolveイベントとカスタムデリゲート手法の両方を個人的に使用してイベントからデータを返しましたが、どちらもVisual Studio 2010で期待どおりに動作します。
それを行う唯一の方法は、引数の1つ(送信者よりも「引数」が望ましい)を変更可能にすることです。まだ変更可能でない場合は、基本的に問題があります。情報を取得する方法はありません。
(わかりました、1つの方法があります-イベント引数自体を不変のままにできますが、その1つのメンバーを、最初にイベントを発生させるコードによって登録されたデリゲートを呼び出すメソッドにすることができます。しかし、それは恐ろしいです。 。)
簡単な解決策は、クロージャーを使用することです:
public override bool Run() {
SomeInfo someInfo = ...
table.WhenData += (obj, args) => {
someInfo.Return = something
};
}