2016-09-20 213 views
0

我正在尝试为我的简单应用程序创建菜单。我想使用开关,但我找不到在应用程序启动时实例化的实例类中调用函数的方法。调用函数还没有实例化的对象C#

class Window 
{ 
    public void startLibrary(int sizeX, int sizeY) 
    { 
     BookList MainLibrary = new BookList(); 
     this.mainMenu(); 
    } 

    public void mainMenu() 
    { 
     string userChoice = Console.ReadLine(); 
     switch (userChoice) 
     { 
      case "1": 

       break; 

我怎么叫MainLibrary在情况1.功能这显然不是在这里实例化,但我不能找到一种方法,通过引用uninstanced对象。

书目代码:

class BookList 
{ 
    List<Book> books = new List<Book>();  
    public void addBook() // adding book 
    { 
     string name = Console.ReadLine(); 
     string author = Console.ReadLine(); 
     int relDate = int.Parse(Console.ReadLine()); 
     int uID = books.Count() + 1; 
     books.Add(new Book(name, author, relDate, uID)); 
    } 
    public void deleteBook() // deleting book 
    { 
     int readForDelete = int.Parse(Console.ReadLine()); 
     books.RemoveAll(Book => Book.UniqueID == readForDelete); 
    } 
    public void borrowBook() // borrowing book 
    { 
     int readForBorrow = int.Parse(Console.ReadLine()); 
     foreach (Book Book in books) 
     { 
      if (Book.UniqueID == readForBorrow) 
       Book.available = false; 
     } 
    } 
    public void returnBook() // returning book 
    { 
     int readForReturn = int.Parse(Console.ReadLine()); 
     foreach (Book Book in books) 
     { 
      if (Book.UniqueID == readForReturn) 
       Book.available = true; 
     } 
    } 
    public void displayBooks() // displaying list of books 
    { 
     string isAvailable; 
     foreach (Book Book in books) 
     { 
      if (Book.available == true) 
       isAvailable = "available"; 
      else 
       isAvailable = "unavailable"; 
      Console.WriteLine(" {0} {1} {2} {3} {4} ", Book.UniqueID, Book.BookName, Book.BookName, Book.ReleaseDate, isAvailable); 
     } 
    } 
    public string Name 
    { 
     get; set; 
    } 
} 

}

+0

我不确定我是否理解问题,但也许您可以将参考作为参数传递给mainMenu函数。 –

+0

您无法传递不存在的内容的引用。引用是对象实例。 –

回答

3

您可能需要您的BookList实例传递给你的mainMenu()方法,或者设置一个全局变量。我会推荐前者。

public void mainMenu(BookList list) { ... } 

然后从startLibrary这样称呼它:

this.mainMenu(MainLibrary); 

作为一个侧面说明,你真的需要brush up on your variable, class, and method naming conventions

+0

谢谢你,工作总监和我想要的方式。我的命名习惯确实令人伤心,但我仍然试图学习这些。 我想命名的主要问题是PascalCasing在字段中。不是吗? – Easy

1

你可以用这样的lambda表达式实现:

class Window 
{ 
    public void startLibrary(int sizeX, int sizeY) 
    { 
     BookList MainLibrary = new BookList(); 
     Action<BookList> action = this.mainMenu(); 
     if (action != null) 
     { 
      action(MainLibrary); 
     } 
    } 

    public Action<BookList> mainMenu() 
    { 
     string userChoice = Console.ReadLine(); 
     switch (userChoice) 
     { 
      case "1": 
       return b => b.addBook(); 
     } 

或者你可以只通过一个关于你MainLibrary变量的方法:

class Window 
{ 
    public void startLibrary(int sizeX, int sizeY) 
    { 
     BookList MainLibrary = new BookList(); 
     this.mainMenu(MainLibrary); 
    } 

    public Action<BookList> mainMenu(BookList b) 
    { 
     string userChoice = Console.ReadLine(); 
     switch (userChoice) 
     { 
      case "1": 
       b.addBook(); 
       break; 
     } 
+0

第二种解决方案可以创造奇迹!万分感谢。你能否解释'return b => b.addBook()'和'Action'部分?我不知道那里发生了什么。我对C#和编码本身非常陌生。预先感谢您:) – Easy

+0

第一个示例出错。我刚刚纠正了这一点。 – Peter

+0

很难用几句话解释lambda表达式和动作......也许这篇文章有助于:http://www.growingwiththeweb.com/2012/08/func-and-action-basics-in-c.html - 或者只是谷歌的“C#行动lambda” – Peter

0

首先,你什么在你的startLibrary方法中得到的是一个局部变量 - 只能在其定义的块中访问。也就是说,MainLibrary不是你可以在其他地方引用的东西。 要解决您的问题,您有几个选项。 您可以使MainLibrary成为Window类的字段/成员。那么窗口类的所有实例方法将有机会获得它 - 这样的MainMenu的方法:

class Window 
{ 
    private BookList MainLibrary; 

    public void startLibrary(int sizeX, int sizeY) 
    { 
     this.MainLibrary = new BookList(); 
     this.mainMenu(); 
    } 

    public void mainMenu() 
    { 
     string userChoice = Console.ReadLine(); 
     switch (userChoice) 
     { 
      case "1": 
       // do whatever you want with this.MainLibrary here 
       break; 
      /// ... 
     } 
    } 
} 

另一种选择将是您创建到MainMenu的方法MainLIbrary实例通过。在这里,您需要更新方法的签名,如下所示:

public void mainMenu(BookList list) 
{ 
    // reference the list now as necessary 
}