Witam,
Na początek kawałek kodu pokazujący co chcę osiągnąć - na tyle proste, że nie trzeba chyba tłumaczyć:
namespace PropertyChange
{
public partial class Form1 : Form
{
Object zmienna;
public Form1()
{
InitializeComponent();
zmienna = new Object();
zmienna.OnChange += new Object.ChangedHandler(zmienna_OnChange);
}
void zmienna_OnChange(object prevValue, object newValue)
{
MessageBox.Show("Zmiana wartości z " + prevValue + " na " + newValue);
}
private void button1_Click(object sender, EventArgs e)
{
zmienna.SetValue(10);
}
private void button2_Click(object sender, EventArgs e)
{
zmienna.SetValue(20);
}
}
public class Object
{
public void SetValue(object val)
{
Property = val;
}
private object valField = null;
public delegate void ChangedHandler(object prevValue, object newValue);
public event ChangedHandler OnChange;
object Property
{
get
{
return valField;
}
set
{
if (System.Object.Equals(valField, value) == false)
OnChange(valField, value);
valField = value;
}
}
}
}
Jak widać - klasa Object generuje eventy jeżeli wartość się zmieni - w evencie jest z jakiej wartości na jaką nastąpiła zmiana. Działa to dobrze, ale zamiast metody SetValue i ewentualnie GetValue chcę używać tylko i wyłącznie operatora =, czyli chcę, żeby było możliwe coś takiego:
zmienna = 5;
zmienna =10; /*Tu wygenerowany event wykrywający zmianę wartości z 5 na 10*/
int a = zmienna;
Jak to zrobić bez możliwości przeciążenia operatora '=' i mając na uwadze, że zapis:
zmienna = 5;
nie spowoduje wywołania konstruktora z parametrem 5, zapis:
zmienna = new Object(5)
już tak, ale i tak niewiele to da, bo OnChange nie będzie jeszcze istnieć (wszak przypisywane jest dopiero po wywołaniu konstruktora), więc dostanę wyjątek
Poradzicie mi jakiś trick? A może tego co chcę nie da się zrobić?