回答編集履歴
1
ちょっとコードの修正とか
answer
CHANGED
@@ -9,7 +9,7 @@
|
|
9
9
|
|
10
10
|
public OperationClass() // コンストラクタ
|
11
11
|
{
|
12
|
-
this._operations =
|
12
|
+
this._operations = typeof(OperationClass)
|
13
13
|
.GetMethods(BindingFlags.Instance | BindingFlags.NonPublic | BindingFlags.DeclaredOnly)
|
14
14
|
.Where(method => method.Name.StartsWith("Operation")) // 頭に"Operation"がつくメソッドを片っ端から収集
|
15
15
|
.ToDictionary(
|
@@ -39,6 +39,6 @@
|
|
39
39
|
}
|
40
40
|
```
|
41
41
|
|
42
|
-
リフレクションは重い処理なので、「クラスのインスタンス生成時に総なめして一気にメソッドキャッシュを作ってしまう」というやり方です。実行時には通常のメソッド呼び出しと変わらない速度になります。
|
42
|
+
リフレクションは重い処理なので、「クラスのインスタンス生成時に総なめして一気にメソッドキャッシュを作ってしまう」というやり方です。各Operationの実行時には通常のメソッド呼び出しと変わらない速度になります。
|
43
|
-
まあ、その分インスタンス生成時が特別に重いんですが。リフレクションは使わないに越したことはないです。
|
43
|
+
まあ、その分インスタンス生成時が特別に重いんですが。最初だけ重いけど後が軽ければいいという割り切りですね。できるならリフレクションは使わないに越したことはないです。
|
44
|
-
|
44
|
+
あと、現状のコードでは、「頭に"Operation"がつく、パブリックでないインスタンスメソッド」を片っ端からDictionaryに放り込むので、`OperationCore`みたいな名前のメソッドが存在すると例外を吐いて死にます。名前を変えれば問題ないですが。
|