ラムダ式です。
それがわかれば理解できます。
わからなければ理解できません。
ラムダ式についてはラムダ式っていうのが分かりません で書いたので詳細は省略します。
これでわからなければネット上に情報はたくさんありますので検索してみてください。
#追記
ラムダ式を使わず書いてみました。
C#
1using System;
2using System.Diagnostics;
3using System.Reactive.Linq;
4using System.Windows.Forms;
5
6namespace WindowsFormsApp1
7{
8 public partial class Form1 : Form
9 {
10 public Form1()
11 {
12 InitializeComponent();
13 }
14
15 private void button1_Click(object sender, EventArgs args)
16 {
17 Observable
18 .FromEvent<MouseEventHandler, MouseEventArgs>(
19 //h => (s, e) => h(e),
20 Conversion,
21
22 //h => this.MouseMove += h,
23 AddHandler,
24
25 //h => this.MouseMove -= h)
26 RemoveHandler)
27 .Subscribe(e =>
28 {
29 Debug.WriteLine($"({e.X},{e.Y})");
30 });
31 }
32
33 private MouseEventHandler Conversion(Action<MouseEventArgs> h)
34 {
35 void action(object s, MouseEventArgs e)
36 {
37 h(e);
38 }
39 return action;
40 }
41
42 private void AddHandler(MouseEventHandler h)
43 {
44 MouseMove += h;
45 }
46
47 private void RemoveHandler(MouseEventHandler h)
48 {
49 MouseMove -= h;
50 }
51 }
52}
FromEvent の引数として、Conversion, AddHandler, RemoveHandler のデリゲートを渡しています。
FromEvent はまず AddHandler を呼び出し、マウスイベントにイベントハンドラを登録します。
そして必要な処理が終われば RemoveHandler を呼び出し、イベントハンドラを削除します。
そして Mouse イベントが起こるたびに Conversion から返された action を呼び出します。
h は FromEvent の登録したデリゲートで、これを呼び出すことにより、以降のオブザーバーに e を渡します。
#追記
Observable.FromEvent の中ではだいたいこんなことが行われていると思います。
C#
1using System;
2using System.Collections.Generic;
3using System.Diagnostics;
4using System.Reactive.Linq;
5using System.Windows.Forms;
6
7namespace WindowsFormsApp1
8{
9 public partial class Form1 : Form
10 {
11 public Form1()
12 {
13 InitializeComponent();
14 }
15
16 private void button1_Click(object sender, EventArgs args)
17 {
18 MyObservable<MouseEventHandler, MouseEventArgs>
19 .FromEvent(
20 h => (s, e) => h(e),
21 h => MouseMove += h,
22 h => MouseMove -= h)
23 .Subscribe(e =>
24 {
25 Debug.WriteLine($"({e.X},{e.Y})");
26 });
27 }
28 }
29
30 class MyObservable<TEventHandler, TEventArgs> : IObservable<TEventArgs>
31 where TEventArgs : EventArgs
32 where TEventHandler : MulticastDelegate
33 {
34 protected IList<IObserver<TEventArgs>> Observers { get; } = new List<IObserver<TEventArgs>>();
35 protected Action<TEventHandler> AddHandler { get; private set; }
36 protected Action<TEventHandler> RemoveHandler { get; private set; }
37 protected TEventHandler EventHandler { get; private set; }
38
39 public static IObservable<TEventArgs> FromEvent(
40 Func<Action<TEventArgs>, TEventHandler> conversion,
41 Action<TEventHandler> addHandler,
42 Action<TEventHandler> removeHandler)
43 {
44 var result = new MyObservable<TEventHandler, TEventArgs>();
45 result.AddHandler = addHandler;
46 result.RemoveHandler = removeHandler;
47 result.EventHandler = conversion(result.Handler);
48 result.AddHandler?.Invoke(result.EventHandler);
49 return result;
50 }
51
52 private void Handler(TEventArgs e)
53 {
54 foreach (var observer in Observers)
55 {
56 observer.OnNext(e);
57 }
58 }
59
60 public IDisposable Subscribe(IObserver<TEventArgs> observer)
61 {
62 Observers.Add(observer);
63 return new Disposable(this, observer);
64 }
65
66 protected void RemoveObserver(IObserver<TEventArgs> observer)
67 {
68 if (Observers.Count == 0) return;
69 Observers.Remove(observer);
70 if (Observers.Count == 0)
71 {
72 RemoveHandler?.Invoke(EventHandler);
73 }
74 }
75
76 class Disposable : IDisposable
77 {
78 protected MyObservable<TEventHandler, TEventArgs> Owner { get; private set; }
79 protected IObserver<TEventArgs> Observer { get; private set; }
80
81 public Disposable(MyObservable<TEventHandler, TEventArgs> owner, IObserver<TEventArgs> observer)
82 {
83 Owner = owner;
84 Observer = observer;
85 }
86
87 public void Dispose()
88 {
89 if (Owner == null) return;
90 Owner.RemoveObserver(Observer);
91 Owner = null;
92 }
93 }
94 }
95}
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2018/10/14 05:21 編集
2018/10/14 07:54
2018/10/14 12:35