N'abandonnez pas pour l'instant sur app.config/app-settings. Afin de stocker des structures de données plus complexes dans notre configuration d'application, nous avons adopté deux approches: Si la structure de données que nous essayons de stocker peut sérialiser vers/depuis XML, nous la stockons sous forme de chaîne dans l'application. paramètres. L'alternative est la mise en œuvre d'un TypeConverter
qui convertit votre structure de données en une chaîne et retour.
Voici un exemple recadrée:
[TypeConverter(typeof(FormStateConverter))]
public class FormState : INotifyPropertyChanged, IDisposable {
private Size _Size = Size.Empty;
private Point _Location = Point.Empty;
private FormWindowState _WindowState = FormWindowState.Normal;
public FormState(Form form) { BindTo(form); }
internal FormState(Size size, Point location, FormWindowState state) {
_Size = size;
_Location = location;
_WindowState = state;
}
// lotsa other code...
}
internal class FormStateConverter : ExpandableObjectConverter {
public override bool CanConvertTo(ITypeDescriptorContext context, Type destinationType) {
if (destinationType == typeof(string)) {
return true;
} else {
return base.CanConvertFrom(context, destinationType);
}
}
public override bool CanConvertFrom(ITypeDescriptorContext context, Type sourceType) {
if (sourceType == typeof(string)) {
return true;
} else {
return base.CanConvertFrom(context, sourceType);
}
}
// This converts a FormState to a string, we're just making a CSV string here...
public override object ConvertTo(ITypeDescriptorContext context, CultureInfo culture, object value, Type destinationType) {
if (destinationType == typeof(String)) {
FormState formState = (FormState)value;
string converted = string.Format("{0},{1},{2},{3},{4}", formState.Size.Height, formState.Size.Width,
formState.Location.X, formState.Location.Y, formState.WindowState.ToString());
return converted;
}
return base.ConvertTo(context, culture, value, destinationType);
}
// This converts a string back into a FormState instance.
public override object ConvertFrom(ITypeDescriptorContext context, CultureInfo culture, object value) {
if (value is string) {
string formStateString = (string)value;
string[] parts = formStateString.Split(','); // split the CSV string
if (parts != null && parts.Length == 5) { // attempt some error checking
Size size = new Size();
Point location = new Point();
FormWindowState state = FormWindowState.Normal;
int tmp;
size.Height = (Int32.TryParse(parts[0], out tmp)) ? tmp : 0;
size.Width = (Int32.TryParse(parts[1], out tmp)) ? tmp : 0;
location.X = (Int32.TryParse(parts[2], out tmp)) ? tmp : 0;
location.Y = (Int32.TryParse(parts[3], out tmp)) ? tmp : 0;
if (string.Equals(parts[4], "maximized", StringComparison.OrdinalIgnoreCase)) {
state = FormWindowState.Maximized;
} else if (string.Equals(parts[4], "minimized", StringComparison.OrdinalIgnoreCase)) {
state = FormWindowState.Minimized;
} else {
state = FormWindowState.Normal;
}
return new FormState(size, location, state);
}
}
return base.ConvertFrom(context, culture, value);
}
}
Après la mise en œuvre du convertisseur de type et d'attribuer notre type de données FormState
avec le TypeConverterAttribute
, le type FormState
apparaît dans notre concepteur Paramètres dans Visual Studio: 
+1 Cela semble être un scénario parfait pour XML, bien que je préfère la sérialisation XML simple à l'option DataSet. –
Je suis avec @santiiiii (j'espère qu'il y en a assez là-bas) mais j'ai fait ça pour une sérialisation rapide et sale et ça a très bien fonctionné. –
Est-il possible qu'un ensemble de données lise l'écriture dans un fichier xml? – callisto