如何在保持内部类私有的同时创建嵌套模型?

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 类中使用它而不公开它,则可以将两者都设为“内部”。 定义一个公共接口,让你的类继承它并声明你的 List 成员 - 例如。 dotnetfiddle.net/1pSjrT 标记List 属性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 模型上发布,我想同时创建两者

如何访问嵌套类的私有成员?

如何在 Swift 中对私有或内部函数进行单元测试?

EF Code First:如何将虚拟集合设为私有,同时仍然让它正确创建我的数据库模型?

如何从嵌套组件发出,同时保持引用函数外部变量的能力