使用构造函数创建对象未触发Setter属性?求解决办法
解决构造函数未触发Setter约束的问题
问题根源很明确:你直接在构造函数里给字段赋值时,并不会触发属性Setter里的逻辑——只有通过属性的set访问器赋值时,那些格式化和约束规则才会生效。
有两种常用的解决方法,不需要手动调用Setter:
1. 构造函数中通过属性赋值(推荐)
把构造函数里的字段直接赋值改成通过属性赋值,这样就会自动触发Setter的逻辑。比如你的Commune构造函数可以改成这样:
public class Commune { private string _name; public string Name { get => _name; set => _name = value?.ToUpper() ?? value; } private int _department; public int Department { get => _department; set => _department = value > 0 ? value : -1; } // 实现Mayor、Population的Setter逻辑(类似Name和Department) private string _mayor; public string Mayor { get => _mayor; set => _mayor = value?.ToLower() ?? value; } private int _population; public int Population { get => _population; set => _population = value > 0 ? value : -1; } public string County { get; set; } // 构造函数通过属性赋值 public Commune(string name, int department, string county, string mayor, int population) { Name = name; // 触发Name的转大写逻辑 Department = department; // 触发Department的正数约束 County = county; Mayor = mayor; // 触发Mayor的转小写逻辑 Population = population; // 触发Population的正数约束 } }
这样用new Commune("name", -5, "count", "may", -5);创建对象时,所有Setter里的规则都会自动生效。
2. 提取共享逻辑,构造函数和Setter复用
如果担心后续规则修改时需要同时改Setter和构造函数,可以把格式化、验证逻辑抽成私有方法,让两者都调用这个方法,避免重复代码:
public class Commune { private string _name; private int _department; private string _mayor; private int _population; public string County { get; set; } // 共享的格式化/验证方法 private string FormatName(string input) => input?.ToUpper() ?? input; private int ValidatePositive(int input) => input > 0 ? input : -1; private string FormatMayor(string input) => input?.ToLower() ?? input; // 属性Setter调用共享方法 public string Name { get => _name; set => _name = FormatName(value); } public int Department { get => _department; set => _department = ValidatePositive(value); } public string Mayor { get => _mayor; set => _mayor = FormatMayor(value); } public int Population { get => _population; set => _population = ValidatePositive(value); } // 构造函数也调用共享方法 public Commune(string name, int department, string county, string mayor, int population) { _name = FormatName(name); _department = ValidatePositive(department); County = county; _mayor = FormatMayor(mayor); _population = ValidatePositive(population); } }
这种方式更利于维护,修改规则时只需要调整对应的私有方法即可。
总结:不需要手动调用Setter,只要让构造函数通过属性Setter或者共享的逻辑方法来初始化属性,就能自动应用你设置的格式和约束规则。
内容的提问来源于stack exchange,提问作者Jeromeo
相关产品推荐
相关产品推荐

