内部类属性只读取除外部类之外的所有访问类

时间:2015-03-05 06:44:27

标签: c# inner-classes readonly

我是c#的新手,在我偶然发现这个时尝试做一些编码。我不知道如何说出来。所以首先是代码。(这是用于解释我的问题的虚拟代码)。

public class DatabaseConnector
{
   public Caching Cache {get;set;}
   //More properties
   //some methods
   public DatabaseConnector(string[] paramters)
   {
      Connect(paramters);
   }
   protected void Connect(string[] paramters) 
   {
         Cache = new Caching();
         Cache.Enabled = true; //this value is set on depending on parameters and database condition.
         //Irrelevant Code 
   }

   //Method to get the database

   public class Caching
   {
      public bool Enabled { get; set; }
      //other properties
      public Caching()
      {
          this.Enabled = false;
          //other properties 
      }
   }
}

现在当用户将该类用作

DatabaseConnector dbConnector = new DatabaseConnector(arguments);

dbConnector.Cahce.Enabled = false; //Should throw error     

if(dbConnector.Cahce.Enabled) //should work.
    dbConnector.Executesomemethod();
else
   dbConnector.ExecutesomeOthermethod();

所以基本上我想将内部类Caching Enabled属性作为除Outer class之外的所有类的只读属性。目前我正在做的是每个Executesomemethod(), ExecutesomeOthermethod(),....,n我正在检查构造函数/连接方法中已经检查的条件以设置Enabled值。

所以我想要的是让inner class属性只读取除Outer class之外的所有访问类的方法。如果有困惑,请随时发表评论。

3 个答案:

答案 0 :(得分:4)

没有办法做到这一点 - 除了类本身的可见性之外,外部类对嵌套类中的成员没有额外的访问权限。

两个选项:

  • cachingEnabled内保留DatabaseConnector私有字段,并为Cache提供DatabaseConnector的实例以从中获取。 (它可以读取私有字段,因为它是嵌套类。)
  • 将只读部分与可写部分分开:

    public interface ICache
    {
        bool Enabled { get; }
    }
    
    public class DatabaseConnector
    {
        private Cache cache;
        public ICache Cache { get { return cache; } }
    
        ...
    
        private class Cache
        {
            // Implementation with writable property
            public bool Enabled { get; set; }
        }
    }
    

请注意,因为实现是私有嵌套类,所以调用者甚至无法转换Cache属性的结果并以这种方式调用setter。 (当然,他们可以在完全信任的环境中使用反射。)

答案 1 :(得分:2)

更改属性:

public bool Enabled { get; set; }

为:

public bool Enabled { get; private set; }

将Cache类构造函数更改为:

public Cache(bool enabled)
{
   Enabled = enabled;
}

将Cache类构造为:

时更改
Cache = new Caching(true);
// remove this line Cache.Enabled = true; 

答案 2 :(得分:2)

这样的事情是否适合你的目的:

public class DatabaseConnector
{
    public Caching Cache { get; set; }

    public DatabaseConnector(string[] paramters)
    {
        Connect(paramters);
    }

    protected void Connect(string[] paramters)
    {
        ICaching Cache = new Caching();
        Cache.Enabled = true;
    }

    private interface ICaching
    {
        bool Enabled { get; set; }
    }

    public class Caching : ICaching
    {
        private bool _enabled { get; set; }

        public Caching()
        {
            _enabled = false;
        }

        bool ICaching.Enabled
        {
            get { return _enabled; }
            set { _enabled = value; }
        }
    }
}

因此私有接口会将属性公开给外部类,但此类之外的任何内容都将无法看到Enabled属性。