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
Hallo martinO,
siehe auch [Artikel] C# und Übergabemechanismen: call by value vs. call by reference (ref/out).
zero_x
zero_x | <span style="font-size: 10;">my</span><span style="font-size: 10;">CSharp</span><span style="font-size: 10;">.de</span> - gemeinsam mehr erreichen
Für längere Zeit inaktiv.
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
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.
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...
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
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 = ...
}
😉 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;
}