コンソールアプリケーションで、ループしてコマンド毎に処理を行うと言うのは昔から良く書かれたコードですが、クラスを使ってクラスのメソッド内でループし、コマンドに対応する処理はイベント扱いにして、クラスのインスタンスを作成した側でイベント登録して処理を実装しています。 ❶ public delegate void AppHandler( string cmd ); イベント( メソッド ) の形式を定義しています。 ❷ public event AppHandler DisplayArg = null; delegate を使って定義されたイベントを格納する為の公開変数を定義しています ❸ DisplayArg(line); DisplayArg イベントをクラス内から呼び出しています。 ❹ app.DisplayArg += arg1; と app.DisplayArg += arg2; 二つのメソッドをイベントとして追加し、クラス内の呼び出し記述は一つですが、二つとも呼び出されます。 ❺ app.Select += (string cmd) => {} メソッドの定義をせずに、ラムダ式を使って匿名のメソッドを作成してその場に記述しています ▼ エントリポイント
using System; using System.Collections.Generic; using System.Data.Odbc; using System.Linq; using System.Text; using System.Threading.Tasks; namespace ConsoleApplication1 { public class Program { // 引数 public static string[] args; // DB接続文字列 static string cs = "Driver={MySQL ODBC 5.2 Unicode Driver};" + "Server=localhost;" + "Database=lightbox;" + "Uid=root;" + "Pwd=パスワード;"; static void Main(string[] args) { // 引数を保存 Program.args = args; App app = new App(); // 単純にメソッドを追加 app.DisplayArg += arg1; app.DisplayArg += arg2; // イベントの追加を明示する app.OpenDb += new App.AppHandler(open); // ラムダ式による実装( 手間を考えると、new は省いたほうが良い ) app.Select += (string cmd) => { Console.WriteLine(cmd + " が実行されました"); // select の結果を表示する }; // ****************************************** // 終了せずに、コマンドプロンプトを保持する。 // ( "q" で終了 ) // ****************************************** app.Loop(); } // ****************************************** // 引数の表示を行うイベント // ****************************************** static private void arg1( string cmd ) { Console.WriteLine(cmd + " が実行されました"); // 引数の数 Console.WriteLine("引数の数 : " + Program.args.Length); } static private void arg2(string cmd) { // 引数を全て表示 int len = Program.args.Length; for (int i = 0; i < len; i++) { Console.WriteLine(Program.args[i]); } } // ****************************************** // データーベースを開くイベント // ****************************************** static private void open(string cmd ) { Console.WriteLine(cmd + " が実行されました"); using (OdbcConnection cn = new OdbcConnection(Program.cs)) { try { cn.Open(); } catch (Exception ex) { Console.WriteLine(ex.Message); } Console.WriteLine("State={0}", cn.State); } Console.WriteLine("処理が終了しました"); } } }
▼ クラス
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace ConsoleApplication1 { class App { public delegate void AppHandler( string cmd ); public event AppHandler DisplayArg = null; public event AppHandler OpenDb = null; public event AppHandler Select = null; // ****************************************** // コンストラクタ // ****************************************** public App() { } // ****************************************** // 終了せずに、コマンドプロンプトを保持する。 // ****************************************** public void Loop() { while (true) { // 専用プロンプト Console.Write("app>"); string line = Console.ReadLine(); // 終了コマンド if (line == "q") { break; } // 引数情報表示 if (line == "arg") { if (DisplayArg != null) { DisplayArg(line); } } // DBを開く if (line == "open") { if (OpenDb != null) { OpenDb(line); } } // select 実行の表示 if (line == "select") { if (Select != null) { Select(line); } } } } } }
関連する記事 += new EventHandler(Method) vs += Method ( どちらでも同じだという英文の記事です )
|
【VS(C#)の最新記事】
- Replit : cs-list
- C# : Excel の新しいブックのデフォルトのシートのセルに直接値をセットして、オートフィルを Range オブジェクトから実行する
- C#( Form ) : ウインドウ枠の無い吹き出しの作成
- C# のタプル( Visual Studio 2017 でテスト )
- C# : インターネット上の JSON ファイルのフォーマットを クラスとして定義して1行でオブジェクト化して使用する
- C# の文法的文字列処理
- C# : System.Data.Odbc によるデータベースのテーブルからのデータ取得処理( サンプルの SQL は MySQL 用です )
- C# : Excel を データベースとして DataGridView に読み込む
- C# : dynamic 型 による Excel へのアクセス
- C# : フォームを表示せずに、通知領域にアイコンを表示させる常駐プログラム
- Microsoft Access に対してSQLを入力してその結果を DataGridView に表示する最も簡単なコード
- C# : System.Data.Odbc データ取得(SELECT)処理( MySQL ) : ※ using 無し( Dispose 実行 )
- C# : SQL 文を外部テキストにして、String.Format でデータ部分を置き換えて利用する
- C# コンソールアプリを AN HTTPD で実行
- C# : SQLServer( SQLExpress ) の SMO を使用してテーブルの CREATE TABLE 文 を取得する
- C# : DataGridView に TKMP.DLL の IMAP(POP3) で受信したメールを非同期に表示する( 添付ファイルも取得 )
- C# : TKMP.DLLを使った、メール送信テンプレート
- C# と VB.net : TKMP.DLL を使って IMAP でメール本文の一覧を取得する( コンソール )
- C# でDataTable と DataSource を使用して、DataGridView にデータを表示するテンプレート( 行をダブルクリックしてダイアログを表示して行データを処理 )
- (C#) / VS2010 または VS2012 : TKMP.DLL(3.1.2 または 3.1.8)を使った、『さくらインターネット』用メール送信テンプレート