近代の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 = ...,
};
しかし、これではコンパイルエラーが出ます。
詳しく見てみると、「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超便利❗❗❗❗❗❗❗❗