Announcement

Collapse
No announcement yet.

PropertyInfo.Setvalue() mit List-Object

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • PropertyInfo.Setvalue() mit List-Object

    Hallo,

    ich möchte eine Property (List<irgendwas>) mit
    SetValue() setzen, aber die Property bleibt immer leer?

    Code:
    // Ausschnitt aus der Settings-Klasse
    ...
            private List<Int16> intTest;
            [Category("Test"),
            DisplayName("IntegerTestList"),
            Description(""),
            public List<Int16> IntTest
            {
                get { return intTest; }
                set { intTest = value;}
            }
    ...
    
    
    // Im Constructor
    ...
         intTest = new List<System.Int16>();
    ...


    Damit kann ich diese diese Eigenschaft im PropertyGrid editieren.
    Das schreiben in eine Parameterdatei geht auch

    Code:
    // Ausschnitt aus der SaveRoutine
    ...
    xmlSubNode = configXml.CreateNode(System.Xml.XmlNodeType.Element, null, "valuelist", null);
    if (property.PropertyType == typeof(List<System.Int16>))
     {
         foreach (System.Int16 item in (List<System.Int16>)property.GetValue(this, null))
          {
                    listItem = configXml.CreateNode(System.Xml.XmlNodeType.Element, null, "listitem", null);
                    listItem.InnerText = item.ToString().Trim();
                    xmlSubNode.AppendChild(listItem);
          }
     }
    ...

    erzeugt folgende XML


    Code:
        <setting name="IntTest" serializeAs="List`1">
          <valuelist>
            <listitem>1</listitem>
            <listitem>2</listitem>
            <listitem>3</listitem>
          </valuelist>
        </setting>
    das lesen geht geht auch

    Code:
    / Ausschnitt aus der Load-Routine
    ...
    object wert;
    if (property.PropertyType == typeof(List<System.Int16>))
     {
            List<System.Int16> list = new List<System.Int16>();
            System.Int16 item;
            foreach (System.Xml.XmlNode itemNode in configItem.ChildNodes)
            {
                    if (System.Int16.TryParse(itemNode.InnerText, out item))
                                list.Add(item);
            }
            wert = list; //<<<<<<< (1)
            property.SetValue(this, wert, null); //<<<<< (2)
    }
    ...
    (1) die Liste wird richtig erzeugt

    (2) die Zuweisung funktioniert nicht, Warum ?

    gruß Mario

  • #2
    An einem simpelst Beispiel ausprobiert und geht.

    Wie sehen deine Rahmenbedingungen aus.
    Befinden sich die Load und Save Routinen in der selben Klasse wie die Property? Oder in einer anderen Klasse bzw. einer Basisklasse bezogen auf die Propery?
    Ist die Property virtuell oder sonst irgendwie ausgezeichnet, zum Beispiel überschrieben?

    Code:
    static class Program
    {
        [STAThread]
        static void Main()
        {
            Data data = new Data();
            data.Load();
            if (data.List.Contains(16)) MessageBox.Show("works");       
        }
    }
    
    public class Data
    {
        public void Load()
        { 
            PropertyInfo propertyInfo = GetType().GetProperty("List");
            List<Int16> list = new List<Int16>() { 16, 17, 18 };
            propertyInfo.SetValue(this, list, null);            
        }
    
        public List<Int16> List { get; set; }
    }

    Comment


    • #3
      Ich habe mal ein ZIP mit folgenden Dateien angehängt:

      -Application.par = Speicherdatei
      -ClassAppsettings.cs = Uprsprungsklasse mit Load und Save etc.
      -ClassSettings.cs = Ableitung der ClassAppSettings

      Die ClassSettings wird im Programm initialisiert und kann dann dem
      PropertyGrid.SelectedObject zugewiesen werden. Damit sind alle
      Properties die nicht die Eigenschaft "Browsable(false)" haben sichtbar.
      Attached Files

      Comment


      • #4
        Hast du das debugged?

        Das ist natürlich zuviel Code in einem (für uns) nicht lauffähigen Zustand um das zu durchblicken. Der eigentliche Code mit der Property Zuweisung sieht mir aber korrekt aus.

        Rufst du in deinem Code die LoadConfig() Methode explizit auf oder irgendwie über den Konstruktor?

        Comment


        • #5
          Das ist natürlich zuviel Code in einem (für uns) nicht lauffähigen Zustand um das zu durchblicken. Der eigentliche Code mit der Property Zuweisung sieht mir aber korrekt aus.
          ...mmm, ich poste eigentlich auch ungern kompletten Code.

          Die SetProperty macht auch sonst was sie soll, nur eben nicht bei der
          'blöden' List.


          Rufst du in deinem Code die LoadConfig() Methode explizit auf oder irgendwie über den Konstruktor?
          Bei einer Fensterapplikation erzeuge ich die Setting Klasse im Konstruktor
          und das LoadConfig rufe ich im OnLoad-Event des mainfensters auf.

          Gruß Mario

          Comment


          • #6
            Hab mir erlaubt aus deinem Code schnell ein lauffähiges Beispiel zumachen. Habe dabei alle unnötigen Codeteile bezogen auf dein beschriebene Problem entfernt.

            Und was soll ich sagen .... funzt
            Attached Files

            Comment


            • #7
              Hallo Ralf,

              ich hab den Fehler gefunden.

              Bei einer Fensterapplikation erzeuge ich die Setting Klasse im Konstruktor
              und das LoadConfig rufe ich im OnLoad-Event des mainfensters auf.
              Das habe ich mir eben noch einmal angesehen.

              So hatte ich das auch, bevor ich die Listen implementierte, gleichzeitig mit den Listen verlagerte ich die LoadConfig vom OnLoad des mainfensters in den Konstruktor der ClassAppsettings (pure Faulheit).

              Die Listenmember der ClassSettings erzeuge ich auch in deren Konstruktor.
              Nur da ClassSettings von ClassAppsettings erbt wird der Konstruktor von
              ClassAppsettings zuerst ausgeführt, und damit auch LoadConfig.
              Somit wird zwar SetValue korrekt ausgeführt, da aber die ListProperty noch nicht Instanziert (new List<...) ist, läust sie ins Leere.

              grrrr.... Warum hab ich das nicht gleich gesehen

              nun, VIELEN DANK für Deine Hilfe, manchmal braucht man den richtigen Tip

              Gruß Mario

              CLOSED

              Comment

              Working...
              X