我已经阅读了《您不懂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