Willkommen auf myCSharp.de! Anmelden | kostenlos registrieren
 | Suche | FAQ

Hauptmenü
myCSharp.de
» Startseite
» Forum
» Suche
» Regeln
» Wie poste ich richtig?

Mitglieder
» Liste / Suche
» Wer ist online?

Ressourcen
» FAQ
» Artikel
» C#-Snippets
» Jobbörse
» Microsoft Docs

Team
» Kontakt
» Cookies
» Spenden
» Datenschutz
» Impressum

  • »
  • Community
  • |
  • Diskussionsforum
Reflektion bei Vererbung
nairolF
myCSharp.de - Member



Dabei seit:
Beiträge: 8

Themenstarter:

Reflektion bei Vererbung

beantworten | zitieren | melden

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
private Nachricht | Beiträge des Benutzers
feadur
myCSharp.de - Member



Dabei seit:
Beiträge: 722
Herkunft: Bonn

beantworten | zitieren | melden

Hi,

etwas Code wäre nützlich... =)
private Nachricht | Beiträge des Benutzers
Traumzauberbaum
myCSharp.de - Member



Dabei seit:
Beiträge: 512

beantworten | zitieren | melden

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
private Nachricht | Beiträge des Benutzers
nairolF
myCSharp.de - Member



Dabei seit:
Beiträge: 8

Themenstarter:

beantworten | zitieren | melden

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)
                    {
                        
                    }
                }
            }
        }
private Nachricht | Beiträge des Benutzers
nairolF
myCSharp.de - Member



Dabei seit:
Beiträge: 8

Themenstarter:

beantworten | zitieren | melden

Zitat
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.
private Nachricht | Beiträge des Benutzers
herbivore
myCSharp.de - Experte

Avatar #avatar-2627.gif


Dabei seit:
Beiträge: 49.486
Herkunft: Berlin

beantworten | zitieren | melden

Hallo nairolF,

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

herbivore
private Nachricht | Beiträge des Benutzers
_tb_
myCSharp.de - Member



Dabei seit:
Beiträge: 416

beantworten | zitieren | melden

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
private Nachricht | Beiträge des Benutzers
nairolF
myCSharp.de - Member



Dabei seit:
Beiträge: 8

Themenstarter:

beantworten | zitieren | melden

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
private Nachricht | Beiträge des Benutzers
nairolF
myCSharp.de - Member



Dabei seit:
Beiträge: 8

Themenstarter:

beantworten | zitieren | melden

Zitat
Original von herbivore
Hallo nairolF,

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

herbivore

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

Florian
private Nachricht | Beiträge des Benutzers