人々が不必要にリフレクションを使用することを警戒する理由はパフォーマンスではありません:はい、リフレクションを使用するためのオーバーヘッドがありますが、多くの場合、問題を解決せずに解決するには、同等の複雑さを持つ別のアプローチが必要です。あまり重要ではありません(特にアプリケーションレベルの開発)。
リフレクションを使用すると、ソースコードに関して通常行うことができるいくつかの重要な仮定が破られ、「すべての参照を検索する」などのツールが確実に機能しなくなります。また、リフレクションは、コンパイラがC#などで実施するほとんどのタイプセーフを基本的に削除し、タイプシステムが通常キャッチしてコンパイラエラーに変換するプログラミングエラーのほとんどを除去します。
では、なぜ人々は反射を使用するのでしょうか?簡単に言えば、上記の問題にもかかわらず、非常に貴重なツールだからです。リフレクションを使用すると、動的プログラミングの利点の一部がC#などの静的で厳密に型指定された言語で得られ、動的プログラミング言語は最近、特にWebプログラミングの領域(PHP、Javascript、非常に顕著なPython)でメリットを発揮します、すべてが動的型付けを使用し、Webプログラミングに適していることが証明されています。しかし、言語はまだC#であるため、アプリケーションのほとんどを厳密に型指定されたOOPイディオムに保ち、動的な振る舞いがリフレクションと実際に違いを生じる小さな部分を記述することを選択できます。
典型的な例は、メソッドをWebサービス呼び出しとして公開する必要がある場合です(まだ.NETに組み込まれていないプロトコルを使用)。厳密に型指定されたOOPアプローチは機能しますが、制限が厳しく、扱いにくいです。ただし、リフレクションを使用してメソッドの呼び出しとキー/値のペアを引数にマッピングする場合、そのようなWebサービスの配管を一度記述してから、任意のクラスで使用できます。