Entwickler-Ecke
Sonstiges (.NET) - Wie kann ich eine Referenz einer globale Variable zuordnen??
c7n - Di 03.02.09 11:26
Titel: Wie kann ich eine Referenz einer globale Variable zuordnen??
Hallo *,
ich schlage mich jetzt schon ein bisschen mit C# rum, komme aber überhaupt nicht weiter (auch nach 2 Tagen rumgegoogle).
(Beide im gleichen Namespace)
Aufrufende Methode in Klasse Page :
C#-Quelltext
1: 2: 3: 4: 5: 6:
| public partial class Page : UserControl { Parser prs1; private XDocument ser_XMLFile_systems = new XDocument(); prs1 = new Parser("systems.xml", ser_XMLFile_systems); } |
Aufzurufenden Methoden in Klasse Parser:
C#-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26:
| public class Parser { private XDocument in_target;
public Parser (string uri_xml_file, XDocument target) { WebClient wc = new WebClient(); wc.DownloadStringCompleted += new DownloadStringCompletedEventHandler(wc_DownloadStringCompleted); wc.DownloadStringAsync(new Uri(uri_xml_file, UriKind.RelativeOrAbsolute)); count_instances++; target = in_target; }
private void wc_DownloadStringCompleted(object sender, DownloadStringCompletedEventArgs e) { if (e.Error == null) { in_target = System.Xml.Linq.XDocument.Parse(e.Result); } count_instances--; if (count_instances == 0) { OnAllFilesDownloaded(this, new EventArgs()); } } } |
Wie bekomme ich jetzt die Referenz in target nach in_target, sodass sich das Objekt, das hinter target steckt durch die Methode wc_DownloadStringCompleted verändert werden kann?
Stichworte, wie Boxing und Unboxing und Regel der OO habe ich schon gehört, finde aber, dass mein Problem in eines dieser Raster fällt...
JüTho - Di 03.02.09 11:44
Hallo und :welcome:
Den Zusammenhang Deiner Klassen und Methoden verstehe ich eigentlich nicht. Aber wenn die private Variable in_target in der Klasse Parser verändert wird und dann "von außen" verwendet werden soll, ist eine Eigenschaft das richtige Verfahren:
C#-Quelltext
1: 2: 3: 4: 5:
| public class Parser { public XDocument target { get { return in_target; } } } |
Gruß Jürgen
c7n - Di 03.02.09 12:01
Wow, das war eine schnelle Reaktionszeit und viele Dank für die Begrüßung.
Ich habe gerade meinen ersten Post nochmal editiert, um ihn vll. etwas deutlicher zu machen:
Also in der Klasse Page wird jeweils eine Instanz von der Klasse Parser aufgerufen (prs1 = new Parser("systems.xml", ser_XMLFile_systems)).
Ihre Funktion zusammengefasst ist:
1. Die angegebene XML-Datei runterladen
2. Wenn die Datei heruntergeladen wurde: Die XML in das XDocument schreiben, dass in dem Konstruktur als 2. Parameter mitgegeben wurde.
Wichtig ist jetzt, dass mit diesem XDocument nun in der Klasse Page weitergearbeitet wird. Die Klasse Parse hat nur die Aufgabe den Download und das Parsing zu kapseln. Danach dürfte/sollte die Instanz Parser auch wieder sterben dürfen.
Daher weiß ich jetzt nicht, ob Eigenschaft da das richtige wäre ??!?! :-\
Viele Grüße
Christian
UGrohne - Di 03.02.09 12:54
Ich würde das über eine CallBack-Methode machen, die Du einer aufzurufenden Methode übergibst. Du solltest aber das Abrufen dann in eine separate Methode auslagern, weil Du sonst in unschöne Situationen kommen könntest, wenn Du die Daten in dem CallBack-Handler weiter verarbeitest und noch nciht alles erzeugt wurde, was Du brauchst:
C#-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42: 43: 44: 45: 46: 47: 48:
| public delegate void CallBackHandler(XmlDocument target); public partial class Page : UserControl { Parser prs1; private XDocument ser_XMLFile_systems = null; prs1 = new Parser();
public Page() { prs1.GetFile("systems.xml", XmlFileReady); }
public void XmlFileReady(XmlDocument target) { ser_XMLFile_systems = target; }
}
public class Parser { private XDocument in_target; private CallBackHandler callBackMethod;
public void GetFile (string uri_xml_file, CallBackHandler callBackMethod) { this.callBackMethod = callBackMethod; WebClient wc = new WebClient(); wc.DownloadStringCompleted += new DownloadStringCompletedEventHandler(wc_DownloadStringCompleted); wc.DownloadStringAsync(new Uri(uri_xml_file, UriKind.RelativeOrAbsolute)); count_instances++; }
private void wc_DownloadStringCompleted(object sender, DownloadStringCompletedEventArgs e) { if (e.Error == null) { in_target = System.Xml.Linq.XDocument.Parse(e.Result); if (callBackHandler != null) callBackHandler(in_target); } count_instances--; if (count_instances == 0) { OnAllFilesDownloaded(this, new EventArgs()); } } } |
Dann kannst Du Dir auch die Initialisierung sparen und die Übergabe einer Variablen. Hab das jetzt so ohne Syntax-Prüfung hingemalt, also ohne Garantie, dass es auf Anhieb funktioniert. Hoffe auch, dass ich Dein Problem richtig verstanden hab ;)
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2025 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!