かずきのBlog@hatena

すきな言語は C# + XAML の組み合わせ。Azure Functions も好き。最近は Go 言語勉強中。日本マイクロソフトで働いていますが、ここに書いていることは個人的なメモなので会社の公式見解ではありません。

購読解除は奥が深い

ReactivePropertyを使いたい人のための、ReactiveExtensions入門(その3)yone64.wordpress.com

よねさんのこの記事を見てもやもやしてたけど、妙案が思いつかないで今にいたる。ということで、こういう拡張メソッドでもReactivePropertyにいれようか悩む。どうだろうか

public class MainWindowViewModel
{
    public ReactiveProperty<PersonViewModel> Person { get; private set; }

    public MainWindowViewModel()
    {
        this.Person = new ReactiveProperty<PersonViewModel>();

        this.Person
            .CleanSubscribe(x => x?.Name.Subscribe(Console.WriteLine));
    }
}

public class PersonViewModel
{
    public ReactiveProperty<string> Name { get; private set; }

    public PersonViewModel()
    {
        this.Name = new ReactiveProperty<string>();
    }
}

public static class Ex
{
    public static IDisposable CleanSubscribe<T>(this IObservable<T> self, Func<T, IDisposable> subscribe)
    {
        return self
            .Select(subscribe)
            .Scan(Tuple.Create(default(IDisposable), default(IDisposable)), (a, b) => Tuple.Create(a.Item2, b))
            .Subscribe(x => x.Item1?.Dispose());
    }
}

メソッド名もいいのが思いつかない。