我是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
之外的所有访问类的方法。如果有困惑,请随时发表评论。
答案 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属性。