読者です 読者をやめる 読者になる 読者になる

かずきのBlog@hatena

日本マイクロソフトに勤めています。XAML + C#の組み合わせをメインに、たまにASP.NETやJavaなどの.NET系以外のことも書いています。掲載内容は個人の見解であり、所属する企業を代表するものではありません。

購読解除は奥が深い

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());
    }
}

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