値を保持し、値が変更されるたびにイベントを発生させ、保持している型との間で暗黙的に変換するクラスを作成しようとしています。
私の目標は、クラスのObservableプロパティを作成し、別のクラス(WPFコントロールを含む)が通常の文字列であるかのように読み書きできるようにすることです。他のクラスは、Observableとしての参照を維持したり、新しいイベントを作成せずに独自のプロパティとして公開したりすることもできます。
これが私がこれまでに持っているものです:
using System;
using System.ComponentModel;
namespace SATS.Utilities
{
public class Observable<T>
{
private T mValue;
public event EventHandler ValueChanged;
public event PropertyChangedEventHandler PropertyChanged;
private void NotifyValueChanged()
{
if (ValueChanged != null)
{
ValueChanged(this, new EventArgs());
}
if (PropertyChanged != null)
{
PropertyChanged(this, new PropertyChangedEventArgs("Value"));
}
}
public T Value
{
get
{
return mValue;
}
set
{
SetValueSilently(value);
NotifyValueChanged();
}
}
public void SetValueSilently(T value)
{
mValue = value;
}
public static implicit operator T(Observable<T> observable)
{
return observable.Value;
}
public static T operator =(Observable<T> observable, T value) // Doesn't compile!
{
observable.Value = value;
return value;
}
}
}
問題は、「=」演算子がオーバーロードできないと文句を言っていることです。それはあらゆる種類の奇妙な行動につながる可能性があるので、それは理にかなっていると思います。私が目指していることを達成する別の方法はありますか?
編集:これが私がこれを実装することに決めた方法です。もっと良い提案があれば教えてください:)
このケースは、Observableを保持するプロパティによって実際に処理される必要があることに気付きました。これが私がやりたいことの例です:
public class A
{
private readonly Observable<string> _property;
public Observable<string> Property
{
get { return _property; }
}
public string Property
{
set { _property.Value = value; }
}
}
もちろん、Propertyは2回定義されているため、コンパイルされません。これは、(多くの人が示唆しているように)暗黙の変換を別の方法で定義することを考えているややハックな回避策です。
public static implicit operator Observable<T>(T value)
{
var result = new Observable<T>();
result.SetValueSilently(value);
return result;
}
それを使用してプロパティのセッターを呼び出します。
public Observable<string> Property
{
get { return _property; }
set { _property.Value = value.Value; }
}