【问题标题】:Public property of private class私有类的公共财产
【发布时间】:2018-05-18 04:20:03
【问题描述】:

我有一个实现站点导航的 NavigationModel 类。在内部有一个 NavigationNode 的私有实现,我希望能够在 NavigationModel 中声明它,但不能在它之外声明。我将如何做到这一点?当我执行以下操作时:

public class NavigationModel
{
    public List<NavigationNode> NavigationNodes { get; set; }
    public NavigationModel()
    {

    }

    private class NavigationNode
    {

    }
}

物业告诉我:

可访问性不一致:属性类型 “列表”比 属性'NavigationModel.NavigationNodes'

【问题讨论】:

  • 为什么不把属性设为私有呢?这么说吧:对于 NavigationModel 之外的任何代码都没有任何意义,那么您打算如何使用它呢?
  • 如果 NavigationNodes 仅打算在 NavigationModel 中使用,那么为什么将其标记为公共?如果它打算公开使用,那么只需将 NavigationNode 设为公开
  • NavigationNodes 将用于在视图中动态构建导航菜单。
  • 没有回答上述问题。问题的重点是询问您是否打算在您的 NavigationModel 类外部使用 NavigationNodes。
  • 我打算使用 NavigationNode 的属性在视图中显示,因此我需要访问这些属性。我希望能够在应用程序中使用导航节点,但不能在 NavigationModel 之外声明它们。

标签: c#


【解决方案1】:

NavigationNode 需要公开才能正常工作。将其公开仍将声明保留在包含类 NavigationModel 的内部,但 NavigationModel 外部的类可以引用它。

【讨论】:

    【解决方案2】:

    引发错误是因为通过将NavigationModel 声明为公共,您创建了一个用于访问 NavigationModel 的公共接口。该接口的一部分是公共方法或属性的签名。这样,您将发布应该是私有的类NavigationNode - 因此出现错误。

    为了解决这个问题,您可以创建一个仅包含您要发布的NavigationNode 部分的公共接口。如果您不想发布任何内容,则该界面为空。以下示例显示了基本组件:

    • 公共接口INavigationNode
    • List&lt;INavigationNode&gt; 类型的属性。
    • 实现接口的私有类NavigationNode

    public interface INavigationNode 
    {
      // Add parts of NavigationNode that you want to publish
    }
    
    public class NavigationModel
    {
        public List<INavigationNode> NavigationNodes { get; set; }
        public NavigationModel()
        {
    
        }
    
        private class NavigationNode : INavigationNode
        {
    
        }
    }
    

    【讨论】:

    • 这是答案,但是我仍然不能这样做,因为我正在对无法使用接口的对象进行 JsonConvert.Deserialize,因此我必须将 NavigationNode 类公开。
    猜你喜欢
    • 1970-01-01
    • 2011-12-21
    • 2019-02-14
    • 1970-01-01
    • 2020-12-17
    • 2012-06-15
    • 2011-03-13
    • 2013-04-27
    • 1970-01-01
    相关资源
    最近更新 更多