C#如何批量将类的所有字符串类型属性设置为空字符串
C#批量重置类所有string属性为string.Empty的实现方案
逐行手写赋值虽然运行时性能最高,但可维护性极差,后续类新增、修改、删除string属性都要同步修改Clear方法,冗余度高还容易漏改,以下是几种更优的实现方式:
方案1:反射实现(通用无侵入,适合绝大多数场景)
核心逻辑是遍历当前类实例的所有可写string类型属性,统一赋值为string.Empty,不需要提前硬编码属性名,后续类调整string属性也不需要修改Clear方法逻辑。
基础实现代码:
public void Clear() { // 筛选当前类所有public、可写的实例级string属性 var stringProperties = GetType().GetProperties(System.Reflection.BindingFlags.Public | System.Reflection.BindingFlags.Instance) .Where(p => p.PropertyType == typeof(string) && p.CanWrite); foreach (var prop in stringProperties) { prop.SetValue(this, string.Empty); } }
性能优化提示:如果Clear方法调用频率很高,可以把当前类的string属性信息缓存到类的静态字段中,只在类第一次加载时执行一次反射扫描,避免每次调用都重复执行反射逻辑,优化后性能和手写逐行赋值几乎持平。
缓存优化版本示例:
// 静态字段:程序运行周期内只执行一次反射,扫描所有需要清空的string属性 // 注意将typeof()内的类名替换为你当前的实际类名 private static readonly System.Reflection.PropertyInfo[] _cachedStringProperties = typeof(YourClassName).GetProperties(System.Reflection.BindingFlags.Public | System.Reflection.BindingFlags.Instance) .Where(p => p.PropertyType == typeof(string) && p.CanWrite) .ToArray(); public void Clear() { foreach (var prop in _cachedStringProperties) { prop.SetValue(this, string.Empty); } }
方案2:源生成器实现(零运行时开销,适合性能要求极高的场景)
如果不想引入反射开销,可以用C#源生成器在编译阶段自动扫描类的所有string属性,自动生成和手写逐行赋值逻辑完全一致的IL代码,既没有运行时反射损耗,也不需要手动维护赋值代码。
使用时只需要把类标记为partial即可:
// 标记为partial类,供源生成器在编译时追加Clear方法实现 public partial class YourBusinessDto { // 这里保留你原本定义的20个string属性即可,不需要额外修改 public string Name { get; set; } public string Address { get; set; } // ... 其余属性定义 }
编译完成后源生成器会自动生成等价于逐行写属性名 = string.Empty的Clear方法,可维护性和性能都拉满。
可选扩展逻辑
如果类中存在不需要清空的特殊string属性,可以自定义一个SkipClearAttribute特性,给不需要重置的属性打上标记,在反射扫描/源生成器扫描时过滤掉带标记的属性即可,不需要修改核心Clear逻辑。如果需要处理非public的string属性,只需要调整反射时的BindingFlags枚举值,把非public属性纳入扫描范围即可。
内容的提问来源于stack exchange,提问作者Robin Sun
相关产品推荐
相关产品推荐

