Problemen met PropertyInfo.SetValue

Status
Niet open voor verdere reacties.

HelpElec

Gebruiker
Lid geworden
6 mrt 2013
Berichten
102
Hallo,

In mijn programma wil ik alle properties van een Control opslaan in een file en daarna herladen.
Ik haal mijn properties op deze manier op:

Code:
public List<String> GetPropertiesAndValues()
        {
            List<String> Rtrn = new List<String>();
            foreach (PropertyInfo Prop in typeof(Button).GetProperties())
            {
                Rtrn.Add(Prop.Name + "-" + Prop.GetValue(this, null));
            }
            return Rtrn;
        }

Vrij simpel, ik schrijf nu vervolgens de List inhoud in een XML-file, met Prop.Name als ElementName en Prop.GetValue als Text.

HTML:
<AllowTransparency>False</AllowTransparency> 
<AutoScale>False</AutoScale> 
<AutoScaleBaseSize>{Width=5, Height=13}</AutoScaleBaseSize>
<AutoScroll>False</AutoScroll>

Zo ziet het er uit.
Maar als ik de file vervolgens heb uitgelezen en naar de properties probeer te schrijven krijg ik op vrij veel properties een InvalidCastException. Ik maak gebruik van Convert.ChangeType.

Code:
foreach (PropertyInfo Prop in typeof(Group).GetProperties())
{
        if (Prop.Name == propertyName)
        {
               Prop.SetValue(this, Convert.ChangeType(propertyVal, Prop.PropertyType), null);
        }
}

Hoe krijg ik het voor elkaar om toch een String om te zetten naar bijvoorbeeld AutoSizeMode, een Color en een Size?
Mijn oplossing is op dit moment om een stuk of 50 if-statements neer te zetten om de Prop.PropertyType te vergelijken:confused:. Dat kan toch wel makkelijker?

Alvast bedankt!!
 
Je zal het moeten checken met PropertyType
Maar 50 if's? hoe kom je daar aan?

Code:
public bool ValidateData(object data)
{
    foreach (PropertyInfo propertyInfo in data.GetType().GetProperties())
    {
        if (propertyInfo.PropertyType == typeof(string))
        {
            string value = propertyInfo.GetValue(data, null);

            if value is not OK
            {
                return false;
            }
        }
    }            

    return true;
}
 
Ik zou denk ik een class maken met de properties die je wilt opslaan van dat control, en deze dan serializen/deserializen naar een xml file.

Klein voorbeeldje:

data class met de properties die je wilt opslaan:
[CPP]public class MyControlData
{
public MyControlData()
{
Text = string.Empty;
Enabled = false;
}
public MyControlData(Control control)
{
this.Text = control.Text;
this.Enabled = control.Enabled;
}

public string Text { get; set; }
public bool Enabled { get; set; }
}[/CPP]



ergens serialize je het (kan ook een method zijn in je MyControlData class
[CPP]private void SaveControlData(Control control)
{
var data = new ControlData(control);
var serializer = new XmlSerializer(typeof(ControlData));
using (var writer = new StreamWriter("controldata.xml"))
{
serializer.Serialize(writer, data);
}
}

private void LoadControlData(Control control)
{
var serializer = new XmlSerializer(typeof(ControlData));

using (var reader = new StreamReader("controldata.xml"))
{
var retrieved = (ControlData)serializer.Deserialize(reader);

control.Text = retrieved.Text;
control.Enabled = retrieved.Enabled;
}
}[/CPP]


bijvoorbeeld ergens om de data van een button op een andere te laden (of uiteraard gewoon bij het afsluiten opslaan, en bij het starten te laden)

[CPP]SaveControlData(button1);
LoadControlData(button2);[/CPP]
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan