C# (.net allgemein) property changed?

01/17/2011 11:02 nkkk#1
also mein problem ist das folgende, angenommen ich habe die folgende klasse:
PHP Code:
class MeineKlasse
{
    public 
String MeinText {getset;}

ich will nun gerne, dass immer wenn "MeinText" geändert wird ich eine ausgabe erhalte, das könnte man natürlich so machen:
PHP Code:
class MeineKlasse
{
    private 
String _MeinText;
    public 
String MeinText 
    
{
        
get
        
{
            return 
this._MeinText;
        }
        
set
        
{
            
Console.WriteLine("der Wert wurde auf " value " geändert")
            
this._MeinText value;
        }

nun ist mir das aber zu umständlich gerade wenn ich sehr viele solcher Properties habe die dich "überwachen" will. Weiss jmd wie es einfacher geht?
was ich im Grunde gerne hätte ware ein lösung mit Attributen, also so ungefähr:
PHP Code:
class MeineKlasse
{
    [
PrintOnChanged()]
    public 
String MeinText {getset;}

,dass ich dann eine klasse "PrintOnChangedAttribute" schreiben müsste wär ein geringes problem wenn es ginge. weiss jmd ob sowas möglich ist?
01/17/2011 12:12 -AmA-#2
Code:
class Program
{
    public Program()
    {
        MeineKlasse test = new MeineKlasse(1);
        test.ChangedHandlers += new MeineKlasse.Changed(this.UeberwachungsMethode);
        Console.WriteLine("Text wird gewechselt");
        test.Change("neuer Text");
        Console.ReadLine();
    }

    public void UeberwachungsMethode(int id, string text)
    {
        Console.WriteLine(id.ToString() + text);
    }
}

class MeineKlasse
{
    private String _MeinText;
    private int _ID;
    public delegate void Changed(int id, string text);
    public event Changed ChangedHandlers;

    public MeineKlasse(int ID)
    {
        _ID = ID;
    }

    public String MeinText
    {
        get
        {
            return this._MeinText;
        }
    }

    public void Change(string text)
    {
        if (text != _MeinText)
        {
            _MeinText = text;
            OnChanged();
        }
    }

    protected void OnChanged()
    {
        Changed temp = ChangedHandlers;

        if (null != temp)
        {
            temp(_ID, _MeinText);
        }
    }
}
ich würds so machen
01/17/2011 12:30 nkkk#3
Quote:
Originally Posted by -AmA- View Post
Code:
class MeineKlasse
{
    private String _MeinText;
    private int _ID;
    public delegate void Changed(int id, string text);
    public event Changed ChangedHandlers;

    public MeineKlasse(int ID)
    {
        _ID = ID;
    }

    public String MeinText
    {
        get
        {
            return this._MeinText;
        }[COLOR=RED]
        //bearbeitet
        set
        {
            _MeinText = value;
            OnChanged();
        }[/COLOR]

    }

    protected void OnChanged()
    {
        Changed temp = ChangedHandlers;

        if (null != temp)
        {
            temp(_ID, _MeinText);
        }
    }
}
ich würds so machen
hmm aber dan muss ich immernoch für jede Property eine set mthode schreibe, was wenn man viele properties in vielen verschiedenen klassen hat sehr umständlich ist. Ob man die set mathode jetzt in "Change" umbenennt ist ja im grunde egal.
01/17/2011 13:01 -AmA-#4
Du kanst dir die Arbeit der Property nicht abnehmen... das geht nicht...
Was aber in diesem Beispiel vorhanden ist, ist die dynamik...
Wenn du diese Klasse weitervererbst kanst du beliebig viele Objekte mit einem Zeiger auf eine beliebige Methode machen, dies nützt dir vorallem beim Auswerten und es ist übersichtlicher.

Ich habe den Code noch ein bischen verändert:

Nun kanst du bei jedem Property das du neu erstellen wilst, einfach den Text übergeben der danach angezeigt wird. Kürzer gehts nicht

Code:
    class A : MeineKlasse
    {
        public A(int ID)
            : base(ID)
        {
        }
        private String _MeinText2;
        public String MeinText2
        {
            get
            {
                return this._MeinText2;
            }
            set
            {
                _MeinText2 = value;
                OnChanged(_MeinText2);
            }
        }
    }
Und wenn das so schlimm ist, dan öffne notepad, füge den Text ein, ersetze MeinText2 durch den namen deines neuen Property, wechsle den datentyp(wenn du wilst)und den namen der Klasse...