Willkommen auf myCSharp.de! Anmelden | kostenlos registrieren
 | Suche | FAQ

Hauptmenü
myCSharp.de
» Startseite
» Forum
» Suche
» Regeln
» Wie poste ich richtig?

Mitglieder
» Liste / Suche
» Wer ist online?

Ressourcen
» FAQ
» Artikel
» C#-Snippets
» Jobbörse
» Microsoft Docs

Team
» Kontakt
» Cookies
» Spenden
» Datenschutz
» Impressum

  • »
  • Community
  • |
  • Diskussionsforum
Eine Property per Referenz übergeben?
moelski
myCSharp.de - Member



Dabei seit:
Beiträge: 184

Themenstarter:

Eine Property per Referenz übergeben?

beantworten | zitieren | melden

Moin !

Kann ich eine Klassen Property als Referenz an eine andere Klasse übergeben?
Mein Versuch dazu klappt leider nicht:

namespace refTest
{
    using System;

    class Program
    {
        static void Main()
        {
            var data = new MyData { myData = "Hello" };

            var test = new MyProp(ref data.myData);

            test.Change();

            Console.WriteLine(data.myData);
            Console.ReadKey();
        }
    }

    public class MyData
    {
        public string myData { get; set; }
    }

    public class MyProp
    {
        string Test { get; set; }

        public MyProp(ref string input)
        {
            this.Test = input;
        }

        public void Change()
        {
            this.Test += " Welt";
        }
    }
}

Hintergrund ist das ich gerne von einer Klasse in einer Konsolen App bestehende Properties ändern würde.
Mein obiges Beipsiel funktioniert so nicht. Geht das in der Form überhaupt?
Ich könnte (im obigen Beispiel) natürlich die Instanz von MyData übergeben und dann den Wert anpassen. Aber das würde mir in meinem Fall nicht helfen.
Greetz Dominik
private Nachricht | Beiträge des Benutzers
herbivore
myCSharp.de - Experte

Avatar #avatar-2627.gif


Dabei seit:
Beiträge: 52329
Herkunft: Berlin

beantworten | zitieren | melden

Hallo moelski,

die Fehlermeldung, die du nach [Hinweis] Wie poste ich richtig? Punkt 5 hättest selbst angeben sollen, ist doch eindeutig:
Fehler
error CS0206: Eine Eigenschaft, ein Indexer oder ein dynamischer Memberzugriff kann nicht als out- oder ref-Parameter übergeben werden.

Wenn man eine Property an eine Methode übergeben will, die einen ref-Parameter erwartet, müsste man also den Wert der Property in einer Variablen speichern, diese per ref übergeben und den geänderten Wert anschließend in die Property zurückschreiben.

Bei deinem Beispiel liegt der Fall noch etwas anders. Das was du willst, geht nicht mal per ref und einer Variable. Bei der Zuweisung an this.Test wird nur der Wert übertragen. Ob ref verwendet wurde oder nicht, macht dabei keinen Unterschied.

Man könnte da nur eine normale Referenz auf ein Objekt übergeben, dessen Properties dann geändert werden können.

Weitere Hinweise in Referenz auf beliebiges Property speichern.

herbivore
private Nachricht | Beiträge des Benutzers
moelski
myCSharp.de - Member



Dabei seit:
Beiträge: 184

Themenstarter:

beantworten | zitieren | melden

Moin !
Zitat
Man könnte da nur eine normale Referenz auf ein Objekt übergeben, dessen Properties dann geändert werden können.
Das habe ich fast befürchtet. Dann muss ich mir für mein Console Property Grid was anderes überlegen.

Danke für die Info herbivore
Greetz Dominik
private Nachricht | Beiträge des Benutzers
Robin0
myCSharp.de - Member



Dabei seit:
Beiträge: 213

beantworten | zitieren | melden

Wenn du wirklich unbedingt eine referenz brauchst nimm die WeakReference-Klasse.

Die WeakReference interessiert es leider nicht ob dein referenzierter wert noch vorhanden ist, desshalb solltest du vorsichtig damit sein.
private Nachricht | Beiträge des Benutzers
herbivore
myCSharp.de - Experte

Avatar #avatar-2627.gif


Dabei seit:
Beiträge: 52329
Herkunft: Berlin

beantworten | zitieren | melden

Hallo Robin0,

mit WeakReference kann man allerdings nur Referenzen auf etwas setzen, worauf man auch normal Referenzen setzen kann. Daher nützt das in Bezug auf das Thread-Thema nichts.



Hallo moelski,

naja, das (Windows Forms) PropertyGrid macht das sicher mit Reflection. Und steuern tut man die Anzeige, in dem man Attribute auf die Properties des anzuzeigenden Typs anwendet.

herbivore
private Nachricht | Beiträge des Benutzers
Spyke
myCSharp.de - Member



Dabei seit:
Beiträge: 146

beantworten | zitieren | melden

Arbeite mit PropertyDescriptor (über TypeDescriptor abfragbar) oder PropertyInfo (über Type abfragbar) und ihren entsprechend GetValue, SetValue Methoden.
Du musst zwar eine Instanz deines Objektes mitgeben, aber da würde eine einfache object Variable reichen (sprich Typ muss nicht direkt bekannt sein).
Dieser Beitrag wurde 1 mal editiert, zum letzten Mal von Spyke am .
private Nachricht | Beiträge des Benutzers