c# - 如何实现只能设置一次的属性
问题描述
我想实现一些只能设置一次的属性。我知道只读,但我希望能够从类外设置值。
情况如下:我有一个类,我用它作为我从数据库中读取的一些数据的键。这个键类包含几个属性。
我的第一个想法是创建多个构造函数,我可以在其中设置我需要的属性,但由于“未设置”是大多数这些属性的有效状态,我很快就有了一堆构造函数,我认为这不是最好的方法。
我不能使用公共设置器创建属性,因为它们是关键信息,之后更改它们是没有好处的。所以我需要一种从键类外部设置它们一次的方法,因为我不想为每种情况制作 20 个稍微不同的构造函数。
是否有一些类似只读的易于使用的方法来做到这一点,还是我必须自己实现它?
解决方案
正如@Fildor 所评论的那样,Builder 模式在这里可能是合适的。您可以根据需要在构建器类上设置属性,在那里允许多重分配没有害处。但是一旦你用它来构建你的类,它就会被锁定,然后就不允许再修改了。
class MyClass {
internal MyClass(MyClassBuilder builder) {
MyProp1 = builder.MyProp1;
MyProp2 = builder.MyProp2;
MyProp3 = builder.MyProp3;
}
public string MyProp1 { get; }
public string MyProp2 { get; }
public string MyProp3 { get; }
}
class MyClassBuilder {
public string MyProp1 { get; set; }
public string MyProp2 { get; set; }
public string MyProp3 { get; set; }
public MyClass Build() => new MyClass(this);
}
用法:new MyClassBuilder { MyProp2 = "abc" }.Build()
。基于相同的总体思想,不同的 API 也是可能的。
推荐阅读
- flutter - 我不明白为什么不从小部件树中删除可解雇
- javascript - 如何添加与传递的道具编号一样多的按钮,而不会在 React 上导致过多的重新渲染?
- python - 如何编写我的 Dockerfile 以包含 chromedriver?
- python - 我想从抓取的工作列表中查看前 50 个常用词。我不断获得所有词频,包括频率为 1 的词
- facebook-graph-api - 使用 Facebook Graph API 创建新页面时出错
- python - Django Rest Framework - 属性错误:“函数”没有属性“get_extra_actions”
- azure - Azure 顾问 - 虚拟机规模集
- javascript - Mapbox - 调用 queryRenderedFeatures 时忽略图标填充
- api - API Data Studio 范围如何工作?
- kubernetes - 基本 Solr 云分组