c# - 使用必须存在的属性初始化类的最佳方法
问题描述
示例类
public class Company {
public Details Details { get; set; }
public List<Employeee> Employees { get; set; }
public Company() {
}
}
public class Details {
public string Name { get; set; }
public string Url { get; set; }
public Details() {
}
}
代码中某处的用法...
var c = new Company();
c.Details = new Details();
c.Details.Name = "Example";
c.Details.Url = "http://example.org/";
没有细节就拥有一家公司是没有意义的。
我的一个想法是
- 更改公司构造函数以自动创建新的详细信息
- 更改详细信息集以确保其未设置为 null
这似乎是一个常见问题,我想知道是否有一种标准的方法来处理它,这将导致可测试的类。我不确定要搜索什么。
解决方案
如果我理解正确,我认为最好的方法是只创建一个带有Details
as 参数的构造函数。
例子:
public class Company
{
public Details Details { get; set; }
public List<Employeee> Employees { get; set; }
public Company(string Name, string Url)
{
this.Details = new Details(Name, Url);
}
public Company(Details Details)
{
this.Details = Details;
}
}
public class Details
{
public string Name { get; set; }
public string Url { get; set; }
public Details(string Name, string Url)
{
// If the validation fails, throw an error
if (string.IsNullOrWhiteSpace(Name))
throw new ArgumentException($"'{nameof(Name)}' cannot be null or empty", nameof(Name));
if (string.IsNullOrWhiteSpace(Url))
throw new ArgumentException($"'{nameof(Url)}' cannot be null or empty", nameof(Url));
this.Name = Name;
this.Url = Url;
}
}
推荐阅读
- r - 复制数据框的行
- amazon-web-services - 如何使用 terraform 从创建的实例创建 AWS AMI?
- javascript - 如何在 firebase 实时数据库中使用更新值?
- javascript - 使用 TypeScript 开发 3rd 方 JS 脚本
- javascript - 我想使用 expo AsyncStorage 将商店持久化到 redux 但我收到错误
- javascript - 在Javascript中将行附加到现有的gridview而不循环
- azure - ASP.NET Core Web 应用程序作为 Azure 服务总线使用者/接收器
- ipad - iPad 模拟器不会在 Xcode 11 beta 5 中启动 NavigationView 应用程序吗?
- java - 使用重新抛出异常的异常处理程序有什么明显的区别吗
- php - 从给定日期获取一周前 PHP