2011-07-04 3 views
0

J'ai un problème lors de l'utilisation de la réflexion.C# Réflexion Problème

J'ai une classe ETSetting qui contient deux objets: Une valeur actuelle et une valeur 'default'. Chaque fois que la méthode SetToDefault est appelée, je veux définir la valeur actuelle à la valeur par défaut.

Voici ma fonction:

public void SetToDefault() { 
      foreach (FieldInfo fi in Value.GetType().GetFields(BindingFlags.NonPublic | BindingFlags.Public | BindingFlags.Instance)) { 
       fi.SetValue(Value, fi.GetValue(defaultVal)); 
      } 
     } 

Cependant, quand j'appelle cela ... Toutes sortes de problèmes se produisent. Je ne peux pas dire avec certitude mais c'est comme si je lisais des parties de la mémoire que je ne devrais pas être (par exemple, quand Value et defaultVal sont toutes deux des chaînes, je reçois toutes sortes de mauvais caractères comme \ t, \ n et caractères chinois).

Évidemment, je fais quelque chose que je ne devrais pas ... Mais quoi?

Merci.

Edit: Voici la classe ETSetting au total:

public sealed class ETSetting { 
     public object Value; 
     private object defaultVal; 

     public ETSetting(object defaultVal) { 
      Value = this.defaultVal = defaultVal; 
     } 

     public void SetToDefault() { 
      foreach (FieldInfo fi in Value.GetType().GetFields(BindingFlags.NonPublic | BindingFlags.Public | BindingFlags.Instance)) { 
       fi.SetValue(Value, fi.GetValue(defaultVal)); 
      } 
     } 
    } 
+1

Quelle est la définition de votre classe 'ETSetting'? – ChrisF

+0

Ajouté à la question de @ChrisF – Xenoprimate

+0

Pouvez-vous fournir un exemple court et compilable reproduisant le problème? – Heinzi

Répondre

1

Ce que vous voulez est une copie d'un objet qui représente la valeur par défaut. Vous pouvez utiliser sérialisation pour cela, ou que vos objets prennent en charge ICloneable, par exemple:

public sealed class ETSetting<T> where T : ICloneable { 
    public T Value; 
    private T defaultVal; 

    public ETSetting(T defaultVal) { 
    this.defaultVal = defaultVal; 
    SetToDefault(); 
    } 

    public void SetToDefault() { 
    Value = (T)defaultVal.Clone(); 
    } 
} 
+0

Merci, j'ai réussi à le faire fonctionner en utilisant la sérialisation. – Xenoprimate