2011-01-05 18 views
6

Non sono sicuro che questa domanda abbia avuto risposta altrove e non riesco a trovare nulla tramite google che non sia un esempio di "Hello World" ... Sto codificando in C# .NET 4.0.Applicazione console 'avanzata'

Sto provando a sviluppare un'applicazione console che si aprirà, visualizzerà testo e attenderà che l'utente inserisca comandi, in cui i comandi eseguiranno una particolare logica aziendale.

Ad esempio: se l'utente apre l'applicazione e digita "help", desidero visualizzare un numero di istruzioni ecc. Ecc. Non sono sicuro di come codificare il "gestore di eventi" per l'input dell'utente.

Speriamo che questo abbia senso. Qualsiasi aiuto sarebbe molto apprezzato! Saluti.

+2

codice una semplice applicazione che dice "comando Bad" non importa ciò che l'utente digita. Quindi pubblica il tuo codice e rendi la tua domanda più specifica. – Jon

+0

Lo farei sicuramente, ma non ho alcun codice perché non sono sicuro da dove iniziare ... – keynesiancross

risposta

21

Sono necessari diversi passaggi per raggiungere questo obiettivo, ma non dovrebbe essere così difficile. Per prima cosa hai bisogno di una sorta di parser che analizzi ciò che scrivi. Per leggere ciascun comando basta usare var command = Console.ReadLine() e quindi analizzare quella linea. Ed eseguire il comando ... logica principale dovrebbe avere una base guardando questo (o quasi):

public static void Main(string[] args) 
{ 
    var exit = false; 
    while(exit == false) 
    { 
     Console.WriteLine(); 
     Console.WriteLine("Enter command (help to display help): "); 
     var command = Parser.Parse(Console.ReadLine()); 
     exit = command.Execute(); 
    } 
} 

una sorta di, si potrebbe forse cambiare che, per essere più complicato.

Il codice per la Parser e il comando è una specie di dritto in avanti:

public interface ICommand 
{ 
    bool Execute(); 
} 

public class ExitCommand : ICommand 
{ 
    public bool Execute() 
    { 
     return true; 
    } 
} 

public static Class Parser 
{ 
    public static ICommand Parse(string commandString) { 
     // Parse your string and create Command object 
     var commandParts = commandString.Split(' ').ToList(); 
     var commandName = commandParts[0]; 
     var args = commandParts.Skip(1).ToList(); // the arguments is after the command 
     switch(commandName) 
     { 
      // Create command based on CommandName (and maybe arguments) 
      case "exit": return new ExitCommand(); 
       . 
       . 
       . 
       . 
     } 
    } 
} 
+1

Grande, grazie. Questo è sicuramente il genere di cose che sto cercando – keynesiancross

+0

Scusa, come funziona l'interfaccia in questo caso? Non ho lavorato molto con le interfacce, quindi potrebbe essere il mio problema ... – keynesiancross

+0

L'interfaccia specifica solo il metodo che dovrebbe avere un oggetto ceratin. Con quello in atto puoi definire diversi oggetti che ereditano dall'interfaccia e lascia che il tuo parser crei quegli oggetti per te.Puoi cambiare l'interfaccia in base alle tue esigenze, l'ho appena fatto con un semplice 'Execute' che restituisce' true' se il programma dovrebbe uscire.Posso aggiornare con un semplice comando e campione –

0

Questo è abbastanza semplice, basta usare i metodi Console.WriteLine e Console.ReadLine(). Da ReadLine ottieni una stringa. Si potrebbe avere un'orribile affermazione che convalida questo rispetto agli input noti/previsti. Meglio sarebbe avere una tabella di ricerca. Il più sofisticato sarebbe scrivere un parser. Dipende davvero da quanto possano essere complessi gli input.

+0

ma con il metodo Console.ReadLine(), come faccio a codificare le diverse permutazioni delle risposte ecc.? Ad esempio Console.ReadLine(), if (Console.ReadLine() == "help) {} ecc. Ecc. – keynesiancross

0

Console.WriteLineConsole.ReadLine e Console.ReadKey sono i tuoi amici. ReadLine e ReadKey attendono l'input dell'utente. Lo string[] args avrà tutti i parametri come "help" in essi. La matrice viene creata separando gli argomenti della riga di comando in base agli spazi.

0
switch (Console.ReadLine()) 
{ 
    case "Help": 
     // print help 
     break; 

    case "Other Command": 
     // do other command 
     break; 

    // etc. 

    default: 
     Console.WriteLine("Bad Command"); 
     break; 
} 

Se stai cercando di analizzare i comandi che hanno altre cose a loro come parametri, ad esempio "manipolare file.txt", allora questo da solo non funzionerà. Ad esempio, è possibile utilizzare String.Split per separare l'input in un comando e argomenti.

0

Questo è molto semplicistico, ma potrebbe soddisfare le vostre esigenze.

// somewhere to store the input 
string userInput=""; 

// loop until the exit command comes in. 
while (userInput != "exit") 
{ 
    // display a prompt 
    Console.Write("> "); 
    // get the input 
    userInput = Console.ReadLine().ToLower(); 

    // Branch based on the input 
    switch (userInput) 
    { 
     case "exit": 
      break; 

     case "help": 
     { 
      DisplayHelp(); 
      break; 
     } 

     case "option1": 
     { 
      DoOption1(); 
      break; 
     } 

     // Give the user every opportunity to invoke your help system :) 
     default: 
     { 
      Console.WriteLine ("\"{0}\" is not a recognized command. Type \"help\" for options.", userInput); 
      break; 
     } 
    } 
} 
1

Un campione:

static void Main(string[] args) 
    { 
     Console.WriteLine("Welcome to test console app, type help to get some help!"); 

     while (true) 
     { 
      string input = Console.ReadLine(); 

      int commandEndIndex = input.IndexOf(' '); 

      string command = string.Empty; 
      string commandParameters = string.Empty; 

      if (commandEndIndex > -1) 
      { 
       command = input.Substring(0, commandEndIndex); 
       commandParameters = input.Substring(commandEndIndex + 1, input.Length - commandEndIndex - 1); 
      } 
      else 
      { 
       command = input; 
      } 

      command = command.ToUpper(); 

      switch (command) 
      { 
       case "EXIT": 
        { 
         return; 
        } 
       case "HELP": 
        { 
         Console.WriteLine("- enter EXIT to exit this application"); 
         Console.WriteLine("- enter CLS to clear the screen"); 
         Console.WriteLine("- enter FORECOLOR value to change text fore color (sample: FORECOLOR Red) "); 
         Console.WriteLine("- enter BACKCOLOR value to change text back color (sample: FORECOLOR Green) "); 
         break; 
        } 
       case "CLS": 
        { 
         Console.Clear(); 
         break; 
        } 

       case "FORECOLOR": 
        { 
         try 
         { 
          Console.ForegroundColor = (ConsoleColor)Enum.Parse(typeof(ConsoleColor), commandParameters); 
         } 
         catch 
         { 
          Console.WriteLine("!!! Parameter not valid"); 
         } 

         break; 
        } 
       case "BACKCOLOR": 
        { 
         try 
         { 
          Console.BackgroundColor = (ConsoleColor)Enum.Parse(typeof(ConsoleColor), commandParameters); 
         } 
         catch 
         { 
          Console.WriteLine("!!! Parameter not valid"); 
         } 

         break; 
        } 
       default: 
        { 
         Console.WriteLine("!!! Bad command"); 
         break; 
        } 
      } 
     } 
    } 
+1

che non è un buon design poiché la tua funzione sta facendo TUTTO il lavoro. Dovresti dividere in modo che ogni parte abbia una sola responsabilità. –

+0

sono d'accordo, ma ho capito che sta cercando codice da cui imparare e che non è troppo complicato. Sei corretto che la logica dovrebbe essere separata .. Alla fine entrambi i tuoi campioni e miei danno lo stesso risultato. – HABJAN

+1

Alla fine ha sicuramente lo stesso risultato, ma non credo che la mia soluzione sia più complicata ed è importante imparare come fare le cose nel modo giusto .... anche se il mio probabilmente non è adatto a tutti ma il design è qualcosa a cui dovresti pensare. Considero anche la mia soluzione più semplice poiché è molto più "fluente" quando la leggi e salti tutti i dettagli se non ne hai bisogno. Ad un livello alto è solo, comando di lettura, analizza il comando e per ultimo esegue il comando. Cioè, puoi saltare i dettagli in come il comando viene analizzato e come viene eseguito. –

1

So che questa è una vecchia questione, ma ero alla ricerca di una risposta troppo. Non sono riuscito a trovarne uno semplice, quindi ho creato InteractivePrompt. È disponibile come NuGet Package ed è possibile estendere facilmente il codice che si trova su GitHub. Presenta anche una cronologia per la sessione corrente.

La funzionalità in questione potrebbero essere attuate in questo modo con InteractivePrompt:

static string Help(string strCmd) 
{ 
    // ... logic 
    return "Help text"; 
} 
static string OtherMethod(string strCmd) 
{ 
    // ... more logic 
    return "Other method"; 
} 
static void Main(string[] args) 
{ 
    var prompt = "> "; 
    var startupMsg = "BizLogic Interpreter"; 
    InteractivePrompt.Run(
     ((strCmd, listCmd) => 
     { 
      string result; 
      switch (strCmd.ToLower()) 
      { 
       case "help": 
        result = Help(strCmd); 
        break; 
       case "othermethod": 
        result = OtherMethod(strCmd); 
        break; 
       default: 
        result = "I'm sorry, I don't recognize that command."; 
        break; 
      } 

      return result + Environment.NewLine; 
     }), prompt, startupMsg); 
}