C#反思问题
我在使用反射时遇到了一个问题 我有一个包含两个对象的类设置:当前值和“默认”值。无论何时调用方法SetToDefault,我都希望将当前值设置为默认值 以下是我的功能:C#反思问题,c#,reflection,C#,Reflection,我在使用反射时遇到了一个问题 我有一个包含两个对象的类设置:当前值和“默认”值。无论何时调用方法SetToDefault,我都希望将当前值设置为默认值 以下是我的功能: public void SetToDefault() { foreach (FieldInfo fi in Value.GetType().GetFields(BindingFlags.NonPublic | BindingFlags.Public | BindingFlags.Instance)) {
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
类的定义是什么?你能提供一个简短的、可编译的例子来重现这个问题吗?有一个问题:值和默认值都指向同一个对象。所以它们的值是一样的。你不能为包含的对象提供一个类型吗?是的,我刚刚看到。。。但它不应该给我如此奇怪的输出,对吗?