特に個人会員への反省は間違っている
- 反射はタイプセーフを壊します。存在しない(もう)メソッド、またはパラメーターが間違っているメソッド、パラメーターが多すぎるメソッド、または不十分なメソッド、または間違った順序(これは私のお気に入り:)であるメソッドを呼び出そうとすることができます。ちなみに、戻り値の型も変わる可能性があります。
- 反射が遅い。
プライベートメンバーのリフレクションはカプセル化の原則に違反するため、コードを次のように公開します。
- クラスの内部動作を処理する必要があるため、コードの複雑さが増します。隠されているものは隠されたままにすべきです。
- コードはコンパイルされますが、メソッドの名前が変更された場合は実行されないため、コードが壊れやすくなります。
- プライベートコードは、プライベートコードの場合、そのように呼び出すことを目的としていないため、簡単に解読できます。おそらく、プライベートメソッドは、呼び出される前に内部状態を期待しています。
とにかくそれをしなければならない場合はどうなりますか?
そのため、サードパーティに依存している場合や、公開されていないAPIが必要な場合は、リフレクションを行う必要があります。所有しているいくつかのクラスをテストするためにそれを使用する人もいますが、テストのためだけに内部メンバーにアクセスできるようにインターフェースを変更する必要はありません。
あなたがそれをするなら、それを正しくしなさい
壊れやすい問題を軽減するには、継続的インテグレーションビルドなどで実行される単体テストでテストすることで、潜在的な中断を検出するのが最善です。もちろん、常に同じアセンブリ(プライベートメンバーを含む)を使用することを意味します。動的なロードとリフレクションを使用する場合は、火で遊ぶのが好きですが、呼び出しが生成する可能性のある例外をいつでもキャッチできます。
.Net Frameworkの最近のバージョンでは、CreateDelegateが50倍にMethodInfoを呼び出してビートしました。
// The following should be done once since this does some reflection
var method = this.GetType().GetMethod("Draw_" + itemType,
BindingFlags.NonPublic | BindingFlags.Instance);
// Here we create a Func that targets the instance of type which has the
// Draw_ItemType method
var draw = (Func<TInput, Output[]>)_method.CreateDelegate(
typeof(Func<TInput, TOutput[]>), this);
draw
呼び出しは、そのような標準としてMethodInfo.Invoke
使用するよりも約50倍速くなります。draw
Func
var res = draw(methodParams);
私のこの投稿をチェックして、さまざまなメソッド呼び出しのベンチマークを確認してください