如何在保持内部类私有的同时创建嵌套模型?
Posted
技术标签:
【中文标题】如何在保持内部类私有的同时创建嵌套模型?【英文标题】:How do I create a nested model while keeping the inner class private? 【发布时间】:2021-11-25 22:24:44 【问题描述】:我想在我的 FilterSelection 模型中封装 Filter 类,这样 Filter 就不能自己实例化。但是试图设置一个属性来访问列表我得到这个错误:
可访问性不一致:属性类型比属性更难访问
public class FilterSelection
public List<Filter> List get; set;
public FilterSelection()
List = new List<Filter>();
private class Filter
public string CustomFilterName get; set;
public string workBook get; set;
【问题讨论】:
您不能将一个属性暴露给可能使用您的类的代码,而不暴露该属性的类型。换句话说,如果您要让我的代码创建一个 FilterSelection 并且因此您要让我访问“List”(我会鼓励一个更好的名称),如果“List”是“Filter”对象的集合,如果我知道“过滤器”是什么,它们对我有什么用?因此,要么类“过滤器”需要是公共的,要么属性“列表”需要是私有的。或者,如果您只想在 FilterSelection 类中使用它而不公开它,则可以将两者都设为“内部”。 定义一个公共接口,让你的类继承它并声明你的 ListList
属性private set;
请记住,从列表中添加和删除项目仍然是get
操作,即使您正在进行更改:您“获取”对对象的引用,然后使用引用调用对象的“Add()”成员函数。
【参考方案1】:
属性和类型的可访问性必须一致(或者至少,属性对类型的可访问性必须小于或等于)。
选项 1 - 使属性和类型可用于任何引用您的类的代码:
public class FilterSelection
public List<Filter> List get; set;
public FilterSelection()
List = new List<Filter>();
public class Filter
public string CustomFilterName get; set;
public string workBook get; set;
选项 2 - 不允许访问属性或类,但在类的构造函数中除外。
public class FilterSelection
private List<Filter> List get; set;
public FilterSelection()
List = new List<Filter>();
private class Filter
public string CustomFilterName get; set;
public string workBook get; set;
选项 3 - 使类和属性可用于此程序集中的任何类,但不能用于程序集之外
public class FilterSelection
internal List<Filter> List get; set;
public FilterSelection()
List = new List<Filter>();
internal class Filter
public string CustomFilterName get; set;
public string workBook get; set;
选项 4 - 使您的属性和类可用于您的类和任何继承您的类的类
public class FilterSelection
protected List<Filter> List get; set;
public FilterSelection()
List = new List<Filter>();
protected class Filter
public string CustomFilterName get; set;
public string workBook get; set;
【讨论】:
我目前正在开发一个 Web API,这是一个 DTO。将 Filter 设置为 public/internal 意味着可以在没有 FilterSelection 的情况下实例化 Filter。将其设置为受保护/私有意味着我无法从控制器或服务层访问我的 List 属性。我希望我的过滤器类与 FilterSelection 相结合,如果可能的话,不要在其他任何地方使用。以上是关于如何在保持内部类私有的同时创建嵌套模型?的主要内容,如果未能解决你的问题,请参考以下文章
当嵌套序列化程序中有另一个模型(manytomany)时,如何在 django 模型上发布,我想同时创建两者