如何在C#中限制对其容器的嵌套类的访问?

cod*_*ior 1 c# inner-classes access-levels

我有一个配置类商店应用程序配置.目前我正在使用静态类.一些配置与一个主题相关,所以我想将它们组织成一个嵌套类,所以我可以引用这样的配置:

AppConfig.Url
AppConfig.LogSettings.FileSize
Run Code Online (Sandbox Code Playgroud)

我有两个选项,要么使用静态嵌套类,

public static class AppConfig
{
    public static class LogSettings
    {
        public static int FileSize {get; set;}
    }
}
Run Code Online (Sandbox Code Playgroud)

或声明一个类但添加一个静态属性:

public static class AppConfig
{
    public class LogSettings
    {
        public int FileSize {get; set;}
    }

    public static LogSettings logSettings { get; private set; }
}
Run Code Online (Sandbox Code Playgroud)

但是,它们都不能保护被其他类修改的嵌套类成员FileSize,即使我private set用来保护公共静态属性.也许我不应该使用嵌套类来实现它?有什么建议?

Eri*_*ert 8

到目前为止给出的其他解决方案基本上要求将属性设置为设置一次.我非常支持不可变对象,但它们并不总是实用的; 是否有可能解决您的问题并使该属性变得可变?

这其实是你造成的更普遍的问题的一个特例:我们如何可以标记一个内部类的某些成员为访问在外部类,但没有任何东西外面的类?

如何做到这一点并不明显,但这非常容易.解决方案的关键是要记住接口可能是私有实现细节.C#需要一个基类至少从它的类派生的访问,但C#也没有要求的实现的接口是可访问的类实现它!

using System;
public static class Outer
{
    private interface IPrivates
    {
        string Name { set; }
    }
    public readonly static Inner TheInner = new Inner();
    private readonly static IPrivates TheInnerPrivates = TheInner;
    public class Inner : IPrivates
    {
        public string Name { get; private set; }        
        string IPrivates.Name { set { this.Name = value; } }
    }
    public static void DoIt()
    {
        TheInnerPrivates.Name = "abc";
    }
}  
public class Program
{
    public static void Main()
    {
        Outer.DoIt();
        Console.WriteLine(Outer.TheInner.Name);
    }
}
Run Code Online (Sandbox Code Playgroud)

里面的代码Outer可以Inner通过接口访问私有成员.Outer除了公共成员之外,代码之外的代码看不到Inner,因为他们需要查看私有成员的接口本身就是私有的.