Laden...

Eine Property per Referenz übergeben?

Erstellt von moelski vor 10 Jahren Letzter Beitrag vor 10 Jahren 4.146 Views
M
moelski Themenstarter:in
183 Beiträge seit 2011
vor 10 Jahren
Eine Property per Referenz übergeben?

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

49.485 Beiträge seit 2005
vor 10 Jahren

Hallo moelski,

die Fehlermeldung, die du nach [Hinweis] Wie poste ich richtig? Punkt 5 hättest selbst angeben sollen, ist doch eindeutig:

Fehlermeldung:
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

M
moelski Themenstarter:in
183 Beiträge seit 2011
vor 10 Jahren

Moin !

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

R
212 Beiträge seit 2012
vor 10 Jahren

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.

49.485 Beiträge seit 2005
vor 10 Jahren

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

S
145 Beiträge seit 2013
vor 10 Jahren

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).