Re: Fragen zur Reflektion
From: Immo Landwerth (mail_ignored_at_web.de)
Date: 05/04/04
- Next message: Frank Dzaebel: "Re: UserControl"
- Previous message: Thomas Scheidegger [MVP]: "Re: Herkunft von besuchten Websiten speichern"
- In reply to: Thomas: "Re: Fragen zur Reflektion"
- Next in thread: Thomas: "Re: Fragen zur Reflektion"
- Reply: Thomas: "Re: Fragen zur Reflektion"
- Messages sorted by: [ date ] [ thread ]
Date: Tue, 04 May 2004 14:06:57 -0700
Thomas wrote:
> > eines vorab: Mir ist nicht ganz klar, was Du eigentlich vorhast.
> > Aber da Du relativ intensiven Gebrauch von Reflection machen
> > willst, ohne irgendwelche Annahmen über die Type machen zu wollen,
> > erweckt das bei mir den Eindruck, dass Du einen dicken Designfehler
> > baust. Erkläre einfach mal genauer, was Du eigentlich tun möchtest.
>
> Die Hauptzielsetzung ist es einen X3D-Betrachter zu programmieren.
> Ein X3D-Betrachter kann eine X3D-Datei auslesen (welche in XML-Format
> vorliegt) und damit eine Darstellung einer virtuellen Welt erzeugen.
> Die einzelnen Objekte, welche in der virtuellen Welt dargestellt
> werden, sind in der XML-Datei definiert. oder genauer gesagt die
> Werte und Beziehungen zwischen den einzelnen Objekten. sind in der
> XML-Datei definiert.
>
> Nun ist es so, dass
> 1. die Klassenstruktur durch die Spezifikation von X3D vorgegeben ist.
> 2. Müssen nicht alle Objekte, die in einer virtuellen Welt vorkommen
> könnten auch in dieser vorkommen, sprich es kann sein, dass ein
> objekt, z.B. eine Box in der XML-Datei definiert sein kann, aber
> nicht muss.. Da ich die Klassennamen aber so gewählt habe, wie die
> Knotennamen der XML-Datei kann ich Objekte durch Reflektion erzeugen.
> Um eine virtuelle Welt aufzubauen, muss zunächst ein Szenengraf
> erzeugt werden (Dies habe ich bereits getan und es ist diese
> hierachische Struktur, worum es geht.).
Also, es ist sehr leicht, anhand eines Typnamens ein entsprechendes
Objekt zu erzeugen. Das geht wie gesagt mit System.Activator. Wenn Du
die Typnamen direkt aus den Namen der XML Knoten ableiten kannst, ist
diese Aufgabe beinahe trivial mittels Reflection zu lösen.
> Nun muss ich diese
> hierarchische Struktur natürlich wieder auslesen um z.B. die
> Darstellung zu aktualisieren oder neu zu rendern. Soviel zu dem
> Problem. Allgemeine Funktionen, die ich immer brauche wie Suchen,
> Copieren, etc. habe ich im Interface IOber deklariert. Spezielle
> Funktionen, wie z.B. das Auslesen des einzelnen XML-Knotens oder
> Darstellung habe ich in der einzelnen Klasse definiert. Ebenso wie
> die Felder, welche für diese speziellen Objekte gelten.
Soweit so gut; mir ist nur nicht klar, warum Du auf einzelene Felder
mittels Reflection zugreifen möchtest bzw. musst. Neben den unzähligen
Positiven Dingen hat Reflection nämlich auch gravierende Nachteile.
1. Wenn Du auf einzelne private oder geschützte Felder zugreifst,
verletzt Du die Möglichkeit der Datenkapslung. Die Wahrung der
Datenintegrität ist daher schwerer zu garantieren.
2. Schreiben und Lesen über Reflection bedeutet späte Bindung. Der
Compiler kann nicht prüfen, ob die Felder existieren, da man sie in
aller Regel als String übergibt.
3. Performance. Jeder Zugriff über Reflection durchläuft mehrer
Prüfungen, die bei früher Bindung i.d.R. nur einmal, manchmal sogar nur
zur Compilezeit, anfallen.
Was kannst Du stattdessen tun? Nun, ab einer gewissen Menge
verschiedener Knotenklassen sind if-Blöcken ala
if (node is NodeClass1)
...
else if (node is NodeClass2)
...
...
nicht mehr zweckmäßig. Du könntest stattdessen Interfaces verwenden,
was Du offenbar schon tust.
Beispielsweise könnten Knoten, in denen man nach Knoten suchen kann,
ein ISearchable implementieren.
Dadurch musst Du nur noch die eigentliche Funkionalität abfragen.
Node FindNode(Node start, string name)
{
if (node is ISearchable)
return ((ISearchable) node).FindNode(text);
else
return null;
}
> In welcher Assembly welcher Typ definiert ist, das weiss ich. Ich
> weiss halt nicht um welchen speziellen Typ es sich handelt, da der
> Szenengraf ja variabel aufgebaut ist und ich nicht mit 100ertsen von
> if-Abfragen arbeiten wollte. Dies macht ein Casting für mich so
> ziemlich unmöglich, es sei denn, du kennst eine Möglichkeit dynamisch
> du kennst eine Möglichkeit dynamisch zu casten.
Was meinst Du mit "dynamisch casten"?
-- Immo Landwerth - Visual Studio 2003 - C# - XanaNews 1.16.3.1
- Next message: Frank Dzaebel: "Re: UserControl"
- Previous message: Thomas Scheidegger [MVP]: "Re: Herkunft von besuchten Websiten speichern"
- In reply to: Thomas: "Re: Fragen zur Reflektion"
- Next in thread: Thomas: "Re: Fragen zur Reflektion"
- Reply: Thomas: "Re: Fragen zur Reflektion"
- Messages sorted by: [ date ] [ thread ]