【问题标题】: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()”成员函数。

标签: c# api oop encapsulation access-modifiers


【解决方案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 相结合,如果可能的话,不要在其他任何地方使用。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-10-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-03
  • 2012-02-29
相关资源
最近更新 更多