我已经阅读了《您不懂js》一书中“作用域与关闭”一章的“作用域关闭”部分。部分网址:You don't know js

而且我想知道是否有可能实现C#中提到的模块模式?

我尝试了以下代码,但标题出现错误,我做错了吗?还是有其他方法可以实现这一目标?

C#代码

class Program
{
    static void Main(string[] args)
    {
        Module module = new Module();
        Module.PublicAPIClass publicAPIClass = module.GetAPI();

        publicAPIClass.PublicAPI.Invoke();
        publicAPIClass.ChangeAPI();
        publicAPIClass.PublicAPI.Invoke();
    }
}

public class Module
{
    protected Action action1 = () => { Console.WriteLine("API1"); };

    protected Action action2 = () => { Console.WriteLine("API2"); };

    public class PublicAPIClass
    {
        public Action PublicAPI { get; set; }

        public void ChangeAPI()
        {
            PublicAPI = action2; //error here
        }
    }

    public PublicAPIClass GetAPI()
    {
        PublicAPIClass publicAPIClass = new PublicAPIClass();
        publicAPIClass.PublicAPI = action1;

        return publicAPIClass;
    }
}

最佳答案

PublicAPIClass中,您尝试访问Module的非静态字段-不允许。如果没有该类的实例,则无法读取其他类的非静态字段。

要解决此问题,您需要将action2更改为static

static Action action2 = () => { Console.WriteLine("API2"); };


或更改从action2读取的方式:

PublicAPI = new Module().action2; //no longer an error here

10-01 21:18