.NET Core应用中如何优化带固定后缀属性的模型类编写
优化.NET Core模型类重复属性的方案
针对你这种重复定义带固定后缀属性的问题,有几个更简洁易维护的方案:
方案一:使用枚举+索引器/字典
先定义枚举统一管理邮箱服务商和国家代码,避免硬编码字符串后缀,再通过字典和索引器封装属性访问:
// 定义枚举统一管理服务商和国家代码 public enum EmailProvider { Gmail, Aol, Outlook, Yahoo, Hotmail, Zoho } public enum CountryCode { IN, AU, UK, US } // 改造后的Category类 public class Category { private readonly Dictionary<(EmailProvider, CountryCode), string?> _emailValues = new(); // 通过索引器实现类似属性的访问方式 public string? this[EmailProvider provider, CountryCode country] { get => _emailValues.TryGetValue((provider, country), out var value) ? value : null; set => _emailValues[(provider, country)] = value; } }
使用示例:
var category = new Category(); category[EmailProvider.Gmail, CountryCode.IN] = "some value"; var gmailInValue = category[EmailProvider.Gmail, CountryCode.IN];
这种方式的优势是:新增服务商或国家只需扩展枚举,无需修改Category类;彻底避免重复代码,还能防止拼写错误(比如你原代码里的ZohoU应该是ZohoUS这类问题)。
方案二:拆分实体类(适合数据库场景)
如果你的模型需要和数据库交互,可拆分出独立的EmailSetting实体,通过集合管理所有配置:
public class EmailSetting { public EmailProvider Provider { get; set; } public CountryCode Country { get; set; } public string? Value { get; set; } } public class Category { public List<EmailSetting> EmailSettings { get; set; } = new(); }
使用示例:
var category = new Category(); category.EmailSettings.Add(new EmailSetting { Provider = EmailProvider.Aol, Country = CountryCode.AU, Value = "aol au value" }); // 查询指定配置 var aolAuValue = category.EmailSettings .FirstOrDefault(s => s.Provider == EmailProvider.Aol && s.Country == CountryCode.AU)? .Value;
这种方案更符合面向对象设计,EF Core也能轻松映射为关联表结构,适合需要持久化的场景。
方案三:源代码生成器(兼容旧代码)
如果必须保留原有的属性命名风格(比如要兼容旧的业务代码),可以用.NET的源代码生成器自动生成这些重复属性:
- 定义枚举(同方案一)
- 编写源代码生成器,遍历
EmailProvider和CountryCode的所有组合,自动生成类似public string? GmailIN { get; set; }的属性代码
生成器会在编译时自动生成所需属性,你只需维护枚举,无需手动编写重复代码,同时保留原有属性的访问方式。
内容的提问来源于stack exchange,提问作者vct
相关产品推荐
相关产品推荐

