Laden...

Parameter: ref/out Übergabe funktioniert nicht bei nicht-Variable

Erstellt von martinO vor 13 Jahren Letzter Beitrag vor 13 Jahren 2.131 Views
M
martinO Themenstarter:in
164 Beiträge seit 2009
vor 13 Jahren
Parameter: ref/out Übergabe funktioniert nicht bei nicht-Variable

Hallo zusammen

So funktionierts:

bool check;
string value;
this.SetValues("XmlElement1", out check, out value);
configuration.CheckElement1 = check;
configuration.ValueElement1 = value;

this.SetValues("XmlElement2", out check, out value);
configuration.CheckElement2 = check;
configuration.ValueElement2 = value;

private void SetValues(string elementName, out bool check, out string value)
{
  check = true;
  value = "some value";
}

Was ich möchte ist jedoch:


this.SetValues("XmlElement1", out configuration.CheckElement1, out configuration.ValueElement1);
this.SetValues("XmlElement2", out configuration.CheckElement2, out configuration.ValueElement2);

Da kommt die Fehlermeldung: Error 11 A property, indexer or dynamic member access may not be passed as an out or ref parameter XYReader.cs

Ich hab zur Zeit 10, in Zukunft gegen 100, vielleicht 1000 Element im Xml die so ausgelesen werden müssen. D.h. ob jetzt da 1 Zeile oder 3 pro Wert steht, ist ein Unterschied.

Mir ist bewusst, dass hier wahrscheinlich ein Designfehler vorliegt - nur seh ich weder den Designfehler, noch seh ich eine Lösung, wie man es als Einzeiler lösen kann.

Habt ihr Vorschläge?

Merci

1.044 Beiträge seit 2008
vor 13 Jahren
3.170 Beiträge seit 2006
vor 13 Jahren

Hallo,

wozu soll das gut sein?
Übergib doch einfach Dein configuration-Objekt, dann kannst Du die Properties innerhalb der SetValues-Funktion direkt setzen.

Gruß, MarsStein

Non quia difficilia sunt, non audemus, sed quia non audemus, difficilia sunt! - Seneca

1.130 Beiträge seit 2007
vor 13 Jahren

Eine property ist eine nette schreibweise für 2 methoden: den setter und den getter.
Wenn man etwas über ref übergibt, übergibt man in wirklichkeit einen zeiger auf einen wert. (wobei dieser zeiger aber dem garbage collector bekannt ist.)
Da eine property aber kein wert, sondern eine schreibweise für methoden ist, geht es nicht.

Projekte:Jade, HttpSaver
Zum Rechtschreiben gibts doch schon die Politiker. Aber die bauen auch nur mist!

M
martinO Themenstarter:in
164 Beiträge seit 2009
vor 13 Jahren

zero_x: vielen Danke für den Artikel - das hat mir wiedermal in Erinnerung gerufen, dass ich viel mit C gearbeitet habe.. 😉

MarsStein: Das configuration-Objekt kann ich nicht übergeben, da je nach Xml-Element andere Properties gesetzt werden sollen (siehe Beispiel, *Element1 vs *Element2)

Ehrlich gesagt habe ich jetzt noch keinen Lösungsansatz...

3.170 Beiträge seit 2006
vor 13 Jahren

Hallo,

da je nach Xml-Element andere Properties gesetzt werden sollen Ja, da hab ich wohl was übersehen 🤔

Dann kannst Du das so nicht lösen, es bleibt Dir nur der Dreizeiler.
Vielleicht kannst Du aber auch umstrukturieren, in welcher Weise kann ich aber nicht sagen, zuwenig Information.

Gruß, MarsStein

Non quia difficilia sunt, non audemus, sed quia non audemus, difficilia sunt! - Seneca

4.939 Beiträge seit 2008
vor 13 Jahren

Hallo martinO,

du hast aber nicht wirklich 10 (bzw. 100 oder 1000) verschiedene Eigenschaften in der Konfigurationsklasse definiert (bzw. zweimal, jeweils ein bool sowie ein string)?
Warum verwendest du keine Liste und definierst dir ein Enum für die einzelnen Werte (dann wäre auch das Setzen der einzelnen Listenwerte kein Problem mehr)?


class ConfigItem
{
  public bool Check { get; set;}
  public string Value { get; set; }
}

class Configuration
{
  ConfigItem[] ConfigItems; // bzw. List<>
}

enum Item { Element1, Element2 } // <- besser benennen

private void SetValues(string elementName, Configuration config, Item item)
{
    int nItem = (int)item;
    config.ConfigItems[nItem].Check = ...
    config.ConfigItems[nItem].Value = ...
}

M
martinO Themenstarter:in
164 Beiträge seit 2009
vor 13 Jahren

😉 Es soll ein Konfigurationsfile für UIAutomated Tests ausglesen werden. Alle Elemente die nicht im Konfigfile sind, werden in den Tests nicht geprüft.

Je nach Kundenlösung entsteht so ein anderes Konfigurationsfile und je nachdem werden dann die einen Tests ausgeführt oder eben nicht. (das ist der Hintergrund zur ganzen Geschichte..) 😉

(n.b.: manchmal ists auch ein int statt ein string Value...)

Ich habs jetzt so gelöst:

public void Read() { 
...
this.GetValues("XmlElement1", ref check, ref value);
configuration.Check1 = check;
configuration.StringValue1 = value;

this.GetValues("XmlElement2, ref check, ref intValue);
configuration.Check2 = check;
configuration.IntValue2 = intValue;
...}

        private void GetValues(string elementName, ref bool check, ref string value)
        {
            check = this.xmlConfiguration.Element(elementName) != null;

            value = check ? this.GetValue(elementName) : string.Empty;
        }

        private void GetValues(string elementName, ref bool check, ref int value)
        {
            var val = string.Empty;

            this.GetValues(elementName, ref check, ref val);

            value = val == string.Empty ? 0 : int.Parse(val);
        }

        private string GetValue(string elementName)
        {
            return this.xmlConfiguration.Element(elementName).Value;
        }