2017-10-06 87 views
1

改变属性时,我读过范围封闭范围&闭幕书章你不知道js。该部分的网址:You don't know js对象引用需要非静态字段,方法或属性“Module.action2”的方法

我不知道是否有可能实现在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; 
    } 
} 
+3

为什么你想申请JS成语C#?你想用'模块模式'解决什么问题? C#有其他解决相同问题的方法(例如命名空间)。 – mjwills

+0

读这本书只是一个尝试。也许PublicAPIClass是不必要的,但我想知道为什么我得到这个错误。 @mjwills – Jaraxuss

+0

谢谢。 @mjwills – Jaraxuss

回答

0

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

要解决这个问题,你需要更改action2static

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

或更改你是从action2阅读方式:

PublicAPI = new Module().action2; //no longer an error here 
相关问题