LoginSignup
10
5

【C#】ReactiveProperty<T>型のプロパティを持つクラスの初期化方法

Posted at

近代のMVVMパターンを採用しているプロジェクト(WPF, .NET MAUI etc.)では、ReactivePropertyを使うことが多いと思います。

特にクラスのプロパティとしてReactiveProperty型やReactivePropertySlim型を使うケースが大半たと思いますが、そのようなクラスをnewする時に困ったことがあります。


class BalanceEntry
{
     public ReactivePropertySlim<Guid> Id { get; } = new();
     public ReactivePropertySlim<DateTime> DateTime { get; } = new();
     public ReactivePropertySlim<bool> IsPayment { get; } = new();
     public ReactivePropertySlim<long> Value { get; } = new();
     public ReactivePropertySlim<string> Summary { get; } = new();
     public ReactivePropertySlim<Guid?> PaymentMethodId { get; } = new();
     public ReactivePropertySlim<bool> IsBudget { get; } = new();
}

(ReactivePropertySlimはReactivePropertyの軽量版クラスです。)

上記のようなクラス定義の時に、このクラスをnewする時に以下のように書きたくなります。

var newEntry = new BalanceEntry
{
    Id.Value = ...,
    DateTime.Value = ...,
    IsBudget.Value = ...,
    IsPayment.Value = ...,
    Value.Value = ...,
    Summary.Value = ...,
    PaymentMethodId.Value = ...,
};

しかし、これではコンパイルエラーが出ます。

image.png

詳しく見てみると、「CS0747: 初期化子のメンバー宣言子が無効です」と出ていますね。

そう、上記の書き方ではダメなのです。。。

ではどう書けばいいかというと、下記のようになります。

var newEntry = new BalanceEntry
{
    Id =
    {
        Value = ...,
    },
    DateTime =
    {
        Value = ...,
    },
    IsBudget =
    {
        Value = ...,
    },
    IsPayment =
    {
        Value = ...,
    },
    Value =
    {
        Value = ...,
    },
    Summary =
    {
        Value = ...,
    },
    PaymentMethodId =
    {
        Value = ...,
    }
};

具体的にすると、このようになります。

※この例だとValue の右辺はId以外はReactiveProperty型です。

var newEntry = new BalanceEntry
{
    Id =
    {
        Value = Guid.NewGuid()
    },
    DateTime =
    {
        Value = DateTime.Value.Add(TimeSpan.Value)
    },
    IsBudget =
    {
        Value = IsBudget.Value
    },
    IsPayment =
    {
        Value = IsOn.Value
    },
    Value =
    {
        Value = Amount.Value
    },
    Summary =
    {
        Value = Summary.Value
    },
    PaymentMethodId =
    {
        Value = PaymentMethod.Value?.Id.Value
    }
};

あとがき

ReactiveProperty超便利❗❗❗❗❗❗❗❗

10
5
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
10
5