public class AwaitableRoutedEvent
{
private TaskCompletionSource<object> _tcs;
public async Task When<TypeOfControl>(TypeOfControl source, string nameOfEvent)
{
_tcs = new TaskCompletionSource<object>();
var targetEventInfo = source.GetType().GetEvent(nameOfEvent);
Delegate tempEventHandler =
Delegate.CreateDelegate(
targetEventInfo.EventHandlerType,
GetType().GetMethod(nameof(RoutedEventHandler), BindingFlags.Instance | BindingFlags.Public));
try
{
targetEventInfo.AddEventHandler(source, tempEventHandler);
await _tcs.Task;
}
finally
{
targetEventInfo.RemoveEventHandler(source, tempEventHandler);
_tcs = null;
}
}
public void RoutedEventHandler(object sender, RoutedEventArgs arguments)
{
_tcs.TrySetResult(null);
}
}
上記のcalssは 'awaitable' RoutedEventHandler
イベントを表します。目標はawait new AwaitableRoutedEvent().When(button_object, "click");
のように使用することです。対象メソッドにバインドできません... from Delegate.Create(..)+ Reflection
IF MAKE public void RoutedEventHandler(object sender, RoutedEventArgs arguments)
STATIC ...と変更するとBindingsFlags
...動作します。しかし私は静的が好きではありません。非静的バージョンでは例外がスローされます:Cannot bind to the target method because its signature or security transparency is not compatible with that of the delegate type
。
私は何かを見逃しましたか?
問題の解決策を見つけた場合は、質問の編集ではなく回答として投稿する必要があります。 – Servy
私が間違っている場合は私を修正しますが、 'async/await'はステートマシンを静的インスタンスにコンパイルします。私はそれが 'static'メソッドを使う必要があると思います。多分、C#7の最新バージョンでは動作が異なりますが、それについてはわかりません。あなたのコードを逆アセンブルしようとしましたか? – VMAtm
@VMAtmいいえ、あなたは間違っています。私はちょうどDelega.Create(...)のいくつかの他の過負荷を使用し、それは大丈夫だった。私はMSILを掘り下げませんでした。なぜなら、近い将来、その問題を発見したいと思います。 –