2011-07-04 95 views
0

我在使用反射時遇到了問題。C#反射問題

我有一個類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