tutorials.de Buch-Aktion 05/2012
ERLEDIGT
NEIN
ANTWORTEN
8
ZUGRIFFE
1246
EMPFEHLEN
  • An Twitter übertragen
  • An Facebook übertragen
AUF DIESES THEMA
ANTWORTEN
  1. #1
    Registriert seit
    Jun 2002
    Ort
    Saarbrücken (Saarland)
    Beiträge
    9.886
    Blog-Einträge
    29
    Hallo!

    hier mal ein kleines Beispiel wie man private Attribute via Reflection auslesen kann:
    Code csharp:
    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
    
    using System;
    using BindingFlags = System.Reflection.BindingFlags;
    using FieldInfo = System.Reflection.FieldInfo;
     
    namespace De.Tutorials.Training
    {
        /// <summary>
        /// A little example for accessing a private instance field via reflection.
        /// </summary>
        /// <author>Thomas.Darimont</author>
        public class ReflectionExample
        {
     
            public static void Main(string[] args)
            {
                PrivateDataHolder privateDataHolder = new PrivateDataHolder();
                Console.WriteLine(GetValueOfPrivateFieldFor(privateDataHolder,"data"));
            }
     
            public const BindingFlags ACCESS_PRIVATE_INSTANCE_FIELDS = BindingFlags.Instance | BindingFlags.NonPublic;
            public static object GetValueOfPrivateFieldFor(object instance, string fieldName)
            {
                FieldInfo fieldInfo = (FieldInfo)instance.GetType().GetMember(fieldName, ACCESS_PRIVATE_INSTANCE_FIELDS).GetValue(0);
                return fieldInfo.GetValue(instance);
            }
     
        }
     
        class PrivateDataHolder
        {
            private string data = "Foo";
        }
    }

    Gruß Tom
     
    Java rocks!
    How to become a good Java Programmer?
    Does IT in Java and .Net
    The only valid measurement of code quality: WTFs / minute
    Blog
    Xing
    Twitter

  2. #2
    Avatar von Christian Kusmanow
    Christian Kusmanow Christian Kusmanow ist offline Mitglied Diamant
    Registriert seit
    Aug 2004
    Ort
    Aachen (NRW)
    Beiträge
    2.208
    Blog-Einträge
    15
    Hallo Tom!

    Krasse Sache. Via Reflection bekommt man auch alles hin.
    Nur leider ist das im sinne der OOP ein bissel abstrus.
    Kannst du mir bitte ein Anwendungsbeispiel dafür nennen. Mir fällt nichts ein.
     
    MfG,
    Christian

    Wer sein Problem definiert, hat es schon halb gelöst!

    Bitte markiert eure Themen als erledigt. Sonst macht so ein Forum als Nachschlagewerk keinen Sinn.

    The Code Project! - C# Programming | C# / VB.NET Pendants

    Regeln + Netiquette

    Liebe FIAEs, verlasst euch nicht auf das was in der Berufsschule "vermittelt" wird
    und vor allem nicht auf das, was euch die IHK dazu erzählt!
    Die haben so viel Ahnung von dem Gewerk, wie der Bundestag vom Haushalt...

  3. #3
    Registriert seit
    Jun 2002
    Ort
    Saarbrücken (Saarland)
    Beiträge
    9.886
    Blog-Einträge
    29
    Hallo!

    Ein Anwendungsfall ist beispielsweise der auf interne Felder einer Klasse aus einer Third-Party Library
    zuzugreifen die dir sonst keine Zugriffsmöglichkeit (über Properties oder sonstiges) bietet.

    Ein weiterer Anwendungsfall wäre die Entwicklung eines eigenen Debug Visualizers für Visual Studio.
    Ich vermisse immernoch einen Visualizer der in IDictionary Implementierungen (beipspielsweise
    HybridDictionary, ListDictionary) hinein schauen kann...

    Außerdem muss ein O/R Mapper der Objekte auf Tabellen abbildet ja auch den "kompletten" Zustand eines Objekts analysieren können um dieses entsprechend vollständig zu speichern. Dabei muss er natürlich auch auf den Zustand zugreiffen können der in privaten Attributen versteckt ist.

    Gruß Tom
     
    Java rocks!
    How to become a good Java Programmer?
    Does IT in Java and .Net
    The only valid measurement of code quality: WTFs / minute
    Blog
    Xing
    Twitter

  4. #4
    Avatar von Christian Kusmanow
    Christian Kusmanow Christian Kusmanow ist offline Mitglied Diamant
    Registriert seit
    Aug 2004
    Ort
    Aachen (NRW)
    Beiträge
    2.208
    Blog-Einträge
    15
    Hallo nochmal!

    Jetzt kann ich mir was darunter vorstellen. Ich muss zugeben,
    dass ich noch nie auf die Idee gekommen bin einen eigenen Debug Visualizer zu schreiben,
    was mir jetzt aber sicherlich nicht mehr schwer fallen wird.

    Ich danke Dir.
     
    MfG,
    Christian

    Wer sein Problem definiert, hat es schon halb gelöst!

    Bitte markiert eure Themen als erledigt. Sonst macht so ein Forum als Nachschlagewerk keinen Sinn.

    The Code Project! - C# Programming | C# / VB.NET Pendants

    Regeln + Netiquette

    Liebe FIAEs, verlasst euch nicht auf das was in der Berufsschule "vermittelt" wird
    und vor allem nicht auf das, was euch die IHK dazu erzählt!
    Die haben so viel Ahnung von dem Gewerk, wie der Bundestag vom Haushalt...

  5. #5
    Avatar von Norbert Eder
    Norbert Eder Norbert Eder ist offline Mitglied Diamant
    Registriert seit
    Feb 2004
    Ort
    Österreich / Graz
    Beiträge
    5.137
    Blog-Einträge
    51
    Bezüglich O/R Mapper seh ich das nicht unbedingt so. Es hängt sehr stark davon ab, wie der O/R Mapper arbeitet und vor allem auch wie das Mapping ansich aussieht. Wichtig ist, was die öffentliche Eigenschaft zurückliefert und eigentlich weniger, wie es mit der privaten Variable aussieht, da die public Property diesen Wert ansich nicht ändern sollte. Immerhin wird normalerweise auch die öffentliche Eigenschaft gemappt und nicht die private.
     

  6. #6
    Registriert seit
    Jun 2002
    Ort
    Saarbrücken (Saarland)
    Beiträge
    9.886
    Blog-Einträge
    29
    Hallo!

    Das das von der Arbeitsweise des O/R Mappers abhängt ist ja wohl klar...
    Wichtig ist, was die öffentliche Eigenschaft zurückliefert und eigentlich weniger, wie es mit der privaten Variable aussieht, da die public Property diesen Wert ansich nicht ändern sollte. Immerhin wird normalerweise auch die öffentliche Eigenschaft gemappt und nicht die private.
    Na ja, die interne Objektrepräsentation (private Attribute) spielt IMHO aber auch eine entscheidenede Rolle. Es kann ja durchaus Zustand geben, der nicht über ein öffentliches Property zugreifbar ist aber trotzdem das Verhalten der jeweiligen Enität beeinflusst. Würde man hier einfach nur die öffentlichen Properties berücksichtigen könnte man den Objektzustand nicht vollständig speichern.

    Gruß Tom
     
    Java rocks!
    How to become a good Java Programmer?
    Does IT in Java and .Net
    The only valid measurement of code quality: WTFs / minute
    Blog
    Xing
    Twitter

  7. #7
    Avatar von Norbert Eder
    Norbert Eder Norbert Eder ist offline Mitglied Diamant
    Registriert seit
    Feb 2004
    Ort
    Österreich / Graz
    Beiträge
    5.137
    Blog-Einträge
    51
    Das ist schon richtig, stellt sich nur die Frage, wie sinnvoll es ist, einen bestimmten Status (der für den O/R Mapper relevant ist) nicht öffentlich zugänglich zu machen. Dadurch ist der O/R Mapper gezwungen, das komplette Objekt zu zerlegen, was ihn natürlich verlangsamt.
     

  8. #8
    Registriert seit
    Jun 2002
    Ort
    Saarbrücken (Saarland)
    Beiträge
    9.886
    Blog-Einträge
    29
    Hallo,

    Mit einem O/R Mapper willst du in der Regel die transparente Persistenz deines Objektmodells ermöglichen.
    D.h. du willst möglichst einfach den kompletten Entitätszustand in der Datenbank speichern und nach der
    Wiederherstellung der Entität soll der Entitätszustand (und das Verhalten) wieder genauso sein wie vor der
    Persistierung.

    Ein Beispiel wäre beispielsweise ein Property names SubmittedJobs das nur über einen get Accessor verfügt und
    intern auf ein privates Attribut namens submittedJobs abgebildet wird. Wenn diese Enität in der Datenbank abgelegt
    wird und später ausgelesen wird muss der O/R Mapper die Möglichkeit haben schreibend auf diese Feld zuzugreifen.
    Da hier aber kein set Mutator am Property definiert ist (submittedJobs könnte beispielsweise ein interner
    Zähler sein, der bei dem Aufruf einer submit(new Job("XXX")); Methode inkrementiert wird. Da der Zustand dieses
    Properties /Attributs nur von intern manipuliert wird macht ein set Mutator keinen Sinn.) kann dies nur per Reflection erfolgen.

    Gruß Tom
     
    Java rocks!
    How to become a good Java Programmer?
    Does IT in Java and .Net
    The only valid measurement of code quality: WTFs / minute
    Blog
    Xing
    Twitter

  9. #9
    Avatar von Norbert Eder
    Norbert Eder Norbert Eder ist offline Mitglied Diamant
    Registriert seit
    Feb 2004
    Ort
    Österreich / Graz
    Beiträge
    5.137
    Blog-Einträge
    51
    Oder man geht von folgender Situation aus:

    DataObject User. Jeder User hat Rechte (Referenz). Diese werden in einer ObjectList (Collection) abgebildet. Sieht dann in etwa so aus (Generics lass ich jetzt mal aussen vor):
    Code csharp:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    
    public class User
    {
       private ObjectList rights = new ObjectList(typeof(Rights));
     
       public ObjectList Rights
       {
          get { return rights; }
       }
    }

    ObjectList ist in diesem Beispiel eine Custom Collection und besitzt beispielsweise eine Methode AddRange:
    Code csharp:
    1
    
    ObjectList.AddRange(ObjectList objects);
    Und in dieser Konstellation muss der O/R Mapper nicht auf die privaten Member zugreifen. So gesehen ist es ziemlich sinnlos darüber zu diskutieren, da genau dieses Beispiel vom O/R Mapper selbst abhängig ist bzw. vom dahinterliegenden Design.

    Es gibt aber natürlich durchaus Fälle wo dies Sinn macht, vor allem wenn man an das Thema Application Server denkt.
     

Ähnliche Themen

  1. SQL, count über zwei Attribute
    Von bgauch im Forum Relationale Datenbanksysteme
    Antworten: 0
    Letzter Beitrag: 19.10.08, 19:04
  2. Antworten: 9
    Letzter Beitrag: 04.08.08, 12:47
  3. Solution-/Project-Files mit Reflection auslesen?
    Von SixDark im Forum .NET Café
    Antworten: 13
    Letzter Beitrag: 11.10.06, 09:03
  4. Antworten: 5
    Letzter Beitrag: 02.05.04, 21:02
  5. Antworten: 1
    Letzter Beitrag: 17.12.03, 15:54