C#反思问题

时间:2011-07-04 15:21:12

标签: c# reflection

使用反射时遇到了问题。

我有一个包含两个对象的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 个答案:

答案 0 :(得分: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();
  }
}