2011-07-04 13 views
0

反射を使用する際に問題が発生しました。C#反射の問題

私は現在の値と 'デフォルト'の2つのオブジェクトを含むクラスETSettingを持っています。 SetToDefaultメソッドが呼び出されるたびに、現在の値をデフォルト値に設定します。ここで

は私の関数である。

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

しかし、私は問題のすべての種類が発生することを...呼び出すとき。私は確かに言うことはできませんが、それは私が(例えば、ValueとdefaultValが両方の文字列であるときに、\ t、\ nのような種類の悪い文字を取得した場合など、 、および中国語の文字)。

明らかに私は何もしていないはずです...しかし何ですか?

ありがとうございました。

編集:ここではETSettingクラスは、合計である:

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

あなた 'ETSetting'クラスの定義は何ですか? – ChrisF

+0

質問に追加@ChrisF – Xenoprimate

+0

問題を再現する簡潔でコンパイル可能な例を提供できますか? – Heinzi

答えて

1

あなたが望むことは、デフォルト値を表すオブジェクトのコピーです。あなたは、たとえば、このためにシリアライズを使用するか、またはあなたのオブジェクトがICloneableをサポートすることができます:

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

ありがとう、私はそれをシリアル化を使用して動作させることができました。 – Xenoprimate