2016-09-14 5 views
1

私はコマンドライン引数として動詞を与えて、いくつかの個別タスクの1つを実行できるコマンドラインアプリケーションを持っています。各タスクはクラスによって処理され、それぞれはメソッドExecute()を含むインタフェースを実装します。 if文やswitch文を使わずにこれをやろうとしています。これまでのところ、私が持っていることはこれです: 実行時に指定されたクラスをインスタンス化し、そのインスタンスのメソッドを呼び出すには、より良い方法はありますか?

var taskTypeName = $"MyApp.Tasks.{invokedVerb}Task"; 
var taskType = Type.GetType(taskTypeName, false); 
var task = Activator.CreateInstance(taskType) as IMaintenanceTask; 
task.Execute(); 

task

は私が達成しようとしているものを根本的にあるタイプ IMaintenanceTask、です。私は dynamicを避けることを好むでしょう - 私が理解していることは、一度しか使われていなければ、ここでのように、キャッシングのメリットが見えず、より少ないキーストロークで反射することです。

このアプローチ(または同じ行に沿ったもの)がパフォーマンスに顕著に影響する可能性がありますか?私はそれが間違いなくランタイム例外/バグの可能性を増やすことは知っていますが、それはこのアプリケーションがスクリプトを介してのみ実行されるという事実によって部分的に緩和されています。予測可能な入力のみを処理します - これは動的に動作するコード内の唯一の場所になります。私は賢明に達成しようとしていますか?または、入力を切り替えて、通常のコンパイル時のコンストラクタを使用して各タイプのタスクを構築し、その上で.Execute()を呼び出すだけで、これを通常の方法で退屈な方法で行うほうがよいでしょう。

答えて

1

1回限りのコールであるため、解決策を検討することができます。例外のチャンスを避けるためにいくつかの条件を追加するだけです。

var taskTypeName = $"MyApp.Tasks.{invokedVerb}Task"; 
var taskType = Type.GetType(taskTypeName, false); 
if (taskType != null && typeof(IMaintenanceTask).IsAssignableFrom(taskType)) 
{ 
    var task = Activator.CreateInstance(taskType) as IMaintenanceTask; 
    task.Execute(); 
} 
+0

'IsAssignableFrom()私はこのコードで私を快適にすることを約知るために必要な正確な機能である'、私はあなたがあまりにも頻繁にコマンドを使用しようとしている場合は – Toadfish

+0

、あなたは簡単に '辞書内のインスタンスをキャッシュすることができると思います ' –

1

タイトなループでない限り、ディスパッチ機構のパフォーマンスは心配しないでください。単一の直接メソッド呼び出しをdynamic経由で単一の呼び出しに切り替えること、リフレクションによる単一の呼び出し、emit APIによる単一の呼び出し、またはコンパイル済みのLINQ式による単一の呼び出しでは、アプリケーションの実行時間に検出可能な差異は生じません。オペレーティングシステムがアプリケーションを起動するのにかかる時間は、アプリケーションがどのメソッドを呼び出すかを決定する時間よりも数桁も長いため、解決方法はswitchとよく似ていますが、よいこと)。

関連する問題