Angular 2/4如何无需循环将类所有成员重置为空白?
无需循环重置类所有成员为空白值的解决方案
嘿,这个问题我帮不少开发者处理过,完全不用你手动写遍历成员的for循环,还能搞定内部对象的重置需求,给你几个靠谱的方案:
方案1:利用反射(灵活适配嵌套对象)
反射可以自动遍历类的所有字段,不管是基础类型还是内部对象,都能统一处理——这里的foreach是反射自动遍历,不是你要避免的手动枚举成员的循环哦。
举个C#的实现示例(Java思路完全一致,只是语法略有不同):
public void ResetAllMembers() { // 遍历当前对象的所有实例字段(包括私有) foreach (var field in this.GetType().GetFields(BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic)) { var fieldType = field.FieldType; // 字符串类型设为空字符串 if (fieldType == typeof(string)) { field.SetValue(this, string.Empty); } // 值类型(int、bool等)设为默认值 else if (fieldType.IsValueType) { field.SetValue(this, Activator.CreateInstance(fieldType)); } // 内部对象类型,递归重置(避免直接置null) else if (fieldType.IsClass && fieldType != typeof(string)) { var innerObject = field.GetValue(this); if (innerObject != null) { // 假设内部对象也实现了ResetAllMembers方法,或者通用处理 var resetMethod = fieldType.GetMethod("ResetAllMembers"); resetMethod?.Invoke(innerObject, null); } } } }
这个方案的优势是不管类后续新增多少成员,都不用修改重置代码,自动适配。
方案2:预定义空白实例,字段覆盖
如果你的类结构比较固定,提前创建一个“空白状态”的实例,然后把它的字段值批量复制到当前对象即可:
// 提前初始化一个空白模板实例 private readonly YourClass _blankTemplate = new YourClass(); public void ResetToBlank() { var classType = typeof(YourClass); // 用空白模板的字段值覆盖当前对象的对应字段 foreach (var field in classType.GetFields(BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic)) { field.SetValue(this, field.GetValue(_blankTemplate)); } }
要注意:如果类里有内部对象,_blankTemplate里的内部对象也要是空白状态,这样替换后内部对象不会变成null。
方案3:用映射工具一键搞定(适合已有工具链的项目)
如果你的项目已经在用AutoMapper这类对象映射工具,那一行代码就能解决:
var blankInstance = new YourClass(); Mapper.Map(blankInstance, this);
AutoMapper会自动处理所有成员的赋值,包括嵌套对象的映射,完全不用操心细节。
小提醒:
- 反射的性能损耗在大多数业务场景下可以忽略,要是对性能要求极高,可以考虑方案2,或者用代码生成工具提前生成重置代码。
- 遍历私有成员时,一定要加上
BindingFlags.NonPublic,不然反射会找不到这些字段。
内容的提问来源于stack exchange,提问作者KudmiSubba
相关产品推荐
相关产品推荐

