使用反射时遇到了问题。
我有一个包含两个对象的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));
}
}
}
答案 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();
}
}