C# 内部类属性使除外部类之外的所有访问类都为只读

C# 内部类属性使除外部类之外的所有访问类都为只读,c#,inner-classes,readonly,C#,Inner Classes,Readonly,我是c#新手,当我无意中发现这一点时,我正试图做一些编码。我不知道该怎么说。所以首先是代码。(这是虚拟代码,只是为了解释我的问题) 现在,当用户将该类用作 DatabaseConnector dbConnector = new DatabaseConnector(arguments); dbConnector.Cahce.Enabled = false; //Should throw error if(dbConnector.Cahce.Enabled) //should work

我是c#新手,当我无意中发现这一点时,我正试图做一些编码。我不知道该怎么说。所以首先是代码。(这是虚拟代码,只是为了解释我的问题)

现在,当用户将该类用作

DatabaseConnector dbConnector = new DatabaseConnector(arguments);

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

if(dbConnector.Cahce.Enabled) //should work.
    dbConnector.Executesomemethod();
else
   dbConnector.ExecutesomeOthermethod();
因此,基本上我想使内部类
缓存
启用
属性作为除
外部类之外的所有类的只读属性。目前我所做的是在每个
Executesomemethod(),ExecutesomeOthermethod(),…,n
中检查构造函数/连接方法中已检查的条件,以设置启用的

所以我想要的是使
内部类
属性对除
外部类
之外的所有访问类只读的方法。如有混淆,请随意评论。

更改属性:

public bool Enabled { get; set; }
致:

将缓存类构造函数更改为:

public Cache(bool enabled)
{
   Enabled = enabled;
}
将构造缓存类时更改为:

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

这样的东西适合你的目的吗:

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; }
        }
    }
}

因此,私有接口将向外部类公开属性,但该类之外的任何对象都无法看到已启用的属性。

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

两种选择:

  • 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; }
        }
    }
    

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

您的意思是希望继承缓存类的每个类都不能设置除DatabaseConnector类之外的已启用属性吗?我怀疑您不希望
缓存
属性本身可由客户端写入,是吗,您是否需要
DatabaseConnector
在构建后能够更改
Enabled
本身的值?如果不是,尼尔的答案是完美的。如果你这样做,那就没用了。@jonsket不,这个类中有一些属性,比如
TimeOut
,还有其他一些东西,比如缓存应该保持多长时间,应该是可写的。@jonsket目前我没有改变任何其他构造函数,但有可能发生这种情况。这就是为什么需要另一种方法。您不希望
ICaching
具有只读属性吗?(这也可以更简单地实现…)+1我想我会选择@JonSkeet-first方法,因为我只有一个问题要处理。但似乎我需要读很多关于抽象的东西。但是考虑得好。我也会采用@JonSkeet方法!只有在DatabaseConnector类之外不需要重用缓存类的情况下,才会出现这种情况。
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; }
        }
    }
}
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; }
    }
}