[Gelöst] Reflection, FieldInfo und GetValue liefern null zurück



  • Hallo zusammen,

    ich probiere gerade ein wenig mit C# und Reflections herum und möchte per Reflection den Inhalt eines bestimmten Attributs lesen.

    public class MyClassA
    {
       public String MyString;
    }
    
    public class MyClassB
    {
       public MyClassA A_ = new MyClassA();
    
       public MyClassB
       {
          FieldInfo fi = A_.GetType().GetField( "MyString", BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic );
          if( fi != null )
          {
             object o = fi.GetValue( A_ );
          }
       }
    }
    

    Der GetValue Aufruf in Zeile 15 liefert mir immer null zurück, obwohl A_ und fi gültig sind. Nach etwas Internet Recherche habe ich herausgefunden, dass ab .NET 4.0 wohl bestimmte Berechtigungen für die Benutzung von Reflection notwendig sind. IsSecurityCritical von fi ist true , daher gibt mir die Laufzeitumgebung für den GetValue Aufruf null zurück.
    Gibt es eine kurze und einfache Lösung, wie ich das Problem per Reflection lösen kann? Der Grund für diesen Weg ist der, dass ein Framework automatisch C# Code erzeugt, aber eine bestimmte Variable nicht öffentlich anbietet. Für meine Versionsverwaltung ist es allerdings wichtig, an diesen Wert zu kommen.

    Edit:
    Code korrigiert



  • Nach etwas Internet Recherche habe ich herausgefunden, dass ab .NET 4.0 wohl bestimmte Berechtigungen für die Benutzung von Reflection notwendig sind. IsSecurityCritical von fi ist true, daher gibt mir die Laufzeitumgebung für den GetValue Aufruf null zurück.

    Wäre mir neu.

    Dein Code hat 2 Probleme:

    1. "MyClassA.GetType()" kompiliert so nicht.
    2. Deine Membervariable heißt "MyString" - du suchst aber nach einer Membervariable namens "Key" !!


  • Deine Frage kann ganz einfach beantwortet werden. Strings haben in .NET einen default-Value und der ist eben immer null. Deshalb ist das Ergebnis was dein Aufruf auf GetValue zurueck gibt, voellig korrekt.



  • Firefighter schrieb:

    Deine Frage kann ganz einfach beantwortet werden. Strings haben in .NET einen default-Value und der ist eben immer null. Deshalb ist das Ergebnis was dein Aufruf auf GetValue zurueck gibt, voellig korrekt.

    facepalm!
    Danke für die Antwort, die Lösung war so offensichtlich. Habe lange kein C# mehr angefasst und dabei völlig vergessen, dass man Objekte mit new anlegen muss (bzw. bei Strings einen Wert zuweisen muss). Nu geht´s jedenfalls.


Anmelden zum Antworten