0

我在我的代码中使用 ReactiveProperty 库,有时我需要将两个ReactiveProperty<T>连接在一起以保持属性数据同步。例如,通过将ReactivePropertySlim服务类中的 a组合到ReactivePropertyViewModel 类中的 a 。

通常我使用下一个代码:

// NewProperty is a ViewModel public property
NewProperty = service.Property.ToReactiveProperty<T>();
var propertyDisposable = NewProperty.Subscribe(value => service.Property.Value = value);

对于单个属性来说,查找并不是那么糟糕,但是当数字变高时,代码就会到达。

现在我使用一个简单的扩展方法来限制代码重复。

public static (IReactiveProperty<T> property, IDisposable cleanup) AttachReactiveProperty<T>(this IReactiveProperty<T> baseProperty)
{
    var newProperty = baseProperty.ToReactiveProperty<T>();
    var cleanup = newProperty.Subscribe(value => baseProperty.Value = value);
    return (newProperty, cleanup);
}

我以一个属性变量和一个 IDisposable 变量结束来管理取消订阅。

var (pausedProperty, pausedDisposable) = remoteConversion.Paused.AttachReactiveProperty();
NewProperty = pausedProperty;

目前,该扩展正在做他的工作(我认为代码较少且清晰)。但是有没有更好的方法来解决这个问题。

4

1 回答 1

0

好吧,我找到了一种类似但更干净(我认为)的方法。

在每个反应类中,我通常都有CompositeDisposable _cleanup这样的字段。

public sealed class SomeClass: IDisposable
{
    private readonly CompositeDisposable _cleanup = new CompositeDisposable();
    
    public void Dispose()
    {
        _cleanup.Dispose();
    }
}

然后使用这个基本的类构造和这个扩展方法

internal static class ReactivePropertyEx
{
    public static IReactiveProperty<T> AttachReactiveProperty<T>(this IReactiveProperty<T> baseProperty, Action<IDisposable> registerDisposable)
    {
        var newProperty = baseProperty.ToReactiveProperty<T>();

        var cleanup = newProperty.Subscribe(value => baseProperty.Value = value);

        registerDisposable(cleanup);

        return newProperty;
    }
}

代码结尾更加简洁优雅。用法是

NewProperty = service.Property.AttachReactiveProperty(disposable => disposable.AddTo(_cleanup));
于 2022-03-03T01:20:44.927 回答