Laden...

Reflektion bei Vererbung

Erstellt von nairolF vor 17 Jahren Letzter Beitrag vor 17 Jahren 2.128 Views
N
nairolF Themenstarter:in
8 Beiträge seit 2006
vor 17 Jahren
Reflektion bei Vererbung

Hallo,

ich habe eine Klasse erstellt, welche mittels Reflektion ein andereres Objekt ausliest um dann die Daten in einer Datenbank zu speichern. Das funktioniert einwandfrei.

Die Klasse ist in einem seperaten Assembly und "kennt" die übergebene Klasse nicht.
Analysiere ich nun Klasse A, so funktioniert das wie ich es möchte.
Leite ich nun Klasse B von Klasse A ab, übergebe dann eine Instanz von B an diese Reflektionklasse, so kann ich mit getProperties() lediglich die Eigenschaften von B auslesen, bekomme aber nicht die vererbten Eigenschaften von A.

Versuche ich nun mit demselben Code innerhalb des Assemblies in welchem A und B definiert sind die Eigenschaften von B auszulesen, erhalte ich auch die Eigenschaften von A.

Eine Möglichkeit wäre sicherlich, meine Reflektion Klasse in das Assembly in welchem A und B definiert sind zu kopieren. Das widerspräche aber meinem Ansatz zur Erstellung wiederverwertbarer Komponenten.

Hat jemand von euch vielleicht eine Idee, wie ich dieses Problem lösen könnte?

Gruss, Florian

F
722 Beiträge seit 2005
vor 17 Jahren

Hi,

etwas Code wäre nützlich... =)

T
512 Beiträge seit 2006
vor 17 Jahren

Ich denke du solltest bei GetProperties die Überladung benutzen, bei der BindingFlags als Parameter genommen werden. Über die kannst du dann ganz exakt einstellen was die Funktion zurückgeben soll.

e.f.q.

Aus Falschem folgt Beliebiges

N
nairolF Themenstarter:in
8 Beiträge seit 2006
vor 17 Jahren

ich bin mir zwar nicht sicher ob dir das was bringt, aber bitteschön.
Damit lese ich testweise die Properties aus.
Ist der Code in einem fremden Assembly, werden bei einer vererbten Klasse nicht die Eigenschaften des Objektes ausgelesen, von welchem es geerbt hat.
Ist der Code in einem Assembly, welches eine Referenz hat auf die Assembly in welchem die Klasse steht, werden auch die Eigenschaften des Basisobjektes ausgelesen.

        private static void iterateForeignObj(object Fremdobj, ArrayList arr)
        {

            Type t = Fremdobj.GetType().BaseType;
            PropertyInfo[] pis = Fremdobj.GetType().GetProperties(BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic);

            foreach (PropertyInfo p in pis)
            {
                if ((p.PropertyType.IsInterface || p.PropertyType.IsClass)
                    && !p.PropertyType.Equals(typeof(string)))
                {
                    try
                    {
                        object o = p.GetValue(Fremdobj, null);
                        if (o != null)
                        {
                            arr.Add(o);
                            iterateForeignObj(o, arr);
                        }

                    }
                    catch (Exception)
                    {
                        
                    }
                }
            }
        }
N
nairolF Themenstarter:in
8 Beiträge seit 2006
vor 17 Jahren

Original von Traumzauberbaum
Ich denke du solltest bei GetProperties die Überladung benutzen, bei der BindingFlags als Parameter genommen werden. Über die kannst du dann ganz exakt einstellen was die Funktion zurückgeben soll.

Das tue ich bereits, nur es hilft nicht.

49.485 Beiträge seit 2005
vor 17 Jahren

Hallo nairolF,

mal ein Schuss ins Blaue: Zugriff per Reflection auf vererbte private Felder

herbivore

_
416 Beiträge seit 2005
vor 17 Jahren

Hallo nairolF,

ich kann dein Problem leider nicht nachvollziehen. Ich hab mal folgendes testweise ausprobiert:

  • die Klassen A, B:A in eine separate, nicht referenzierte Assembly gepackt und via Reflection B erstellt.
  • Den Auslesecode in die separate Assembly gepackt und die Methode invoked.
    Beide Versionen haben mit sowohl die Eigenschaften von B, als auch von A zurückgegeben.

Auf jeden Fall verweisen die Assemblys nicht aufeinander, so wie du beschrieben hattest. Ich würde mal vermuten der Fehler liegt bei dir an anderer Stelle. Vielleicht könntest du mal ein ausführlicheres Beispiel posten, so dass man den Fehler auch nachvollziehen kann.

cu, tb

N
nairolF Themenstarter:in
8 Beiträge seit 2006
vor 17 Jahren

Es tut mir echt leid... jetzt funktioniert es hier mit einem anderen Projekt.
Ich habe das jetzt hier zu Hause mit genau den Codeschnipseln gemacht, die ich auch in dem Projekt auf der Arbeit hatte.
Hab also wieder verschiedene Projekte erstellt - eines, welches eine Instanz einer abgeleiteten Klasse erzeugt, und eines welches eine Klasse mit dem Auslesemechanismus besitzt.
Hier hat es funktioniert. Auf der Arbeit nicht.
Einzigster Unterschied ist, dass in der Basisklasse auf der Arbeit verschiedene COM Objekte gekapselt sind.
Ich werde mir das am Montag noch mal ansehen.

Gruss, Florian

N
nairolF Themenstarter:in
8 Beiträge seit 2006
vor 17 Jahren

Original von herbivore
Hallo nairolF,

mal ein Schuss ins Blaue:
>

herbivore

Das wars. Danke.
Mit "protected" hat es funktioniert.

Florian