C#反思问题

C#反思问题,c#,reflection,C#,Reflection,我在使用反射时遇到了一个问题 我有一个包含两个对象的类设置:当前值和“默认”值。无论何时调用方法SetToDefault,我都希望将当前值设置为默认值 以下是我的功能: public void SetToDefault() { foreach (FieldInfo fi in Value.GetType().GetFields(BindingFlags.NonPublic | BindingFlags.Public | BindingFlags.Instance)) {

我在使用反射时遇到了一个问题

我有一个包含两个对象的类设置:当前值和“默认”值。无论何时调用方法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));
            }
        }
    }
您需要的是表示默认值的对象的副本。您可以为此使用序列化,或者让对象支持
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();
  }
}
公共密封类ETSETING,其中T:ICLONABLE{
公共价值观;
私人T-val;
公共ETSETING(T defaultVal){
this.defaultVal=defaultVal;
SetToDefault();
}
public void SetToDefault(){
Value=(T)defaultVal.Clone();
}
}

你的
ETSetting
类的定义是什么?你能提供一个简短的、可编译的例子来重现这个问题吗?有一个问题:值和默认值都指向同一个对象。所以它们的值是一样的。你不能为包含的对象提供一个类型吗?是的,我刚刚看到。。。但它不应该给我如此奇怪的输出,对吗?