teratail header banner
teratail header banner
質問するログイン新規登録

回答編集履歴

3

解決案を補足

2016/10/06 03:33

投稿

KSwordOfHaste
KSwordOfHaste

スコア18404

answer CHANGED
@@ -10,4 +10,8 @@
10
10
  throw new ArgumentException("command out of range");
11
11
  m.Invoke(this, new object[] { s });
12
12
  }
13
- ```
13
+ ```
14
+
15
+ commandによる動的な処理の切り替えが必要でかつこれが本番のコードだとしたら、OperationXというメソッドが頻繁に追加されるような開発途中の段階でOperationCoreをメンテする工数を省く目的でこういう実装をすることはあるかも知れません。GetMethodが順サーチしていて(調べたことがないのですがそうなのでしょうか?)そこがボトルネックになるようならさらにhisignさんがおっしゃる方法やさらにDictionaryの代わりに配列にするなどを検討すべきと思います。
16
+
17
+ それ以上の性能的配慮もしくは設計方式がこれでよいかどうかについては質問内容の範囲を超えてしまうので、もし課題があるなら別トピックを起こすのがよろしいかと思います。

2

不要なthisを取りました

2016/10/06 03:33

投稿

KSwordOfHaste
KSwordOfHaste

スコア18404

answer CHANGED
@@ -2,7 +2,7 @@
2
2
 
3
3
  ```C#
4
4
  private void OperationCore(int command, string text) {
5
- Method m = this.GetType().GetMethod("Operation" + command,
5
+ Method m = GetType().GetMethod("Operation" + command,
6
6
  BindingFlags.Public | BindingFlags.NonPublic |
7
7
  BindingFlags.Instance | BindingFlags.Static |
8
8
  BindingFlags.DeclaredOnly);

1

誤記訂正

2016/10/06 02:56

投稿

KSwordOfHaste
KSwordOfHaste

スコア18404

answer CHANGED
@@ -1,4 +1,4 @@
1
- 質問者さんのコードのBingindFlagsをみて「この存在するCommandXという名前の全部のメソッドをテストするために使うコードなのかな?」と感じました。基底クラスからの継承メソッドを対象外にしていてその他のものはインスタンスメソッドであろうがstaticメソッドであろうが何でも呼び出すというふうになっていますので。もしそういう目的で実行時のInvokeのオーバーヘッドを気にしないというなら単純に以下のようでいいと思います。
1
+ 質問者さんのコードのBingindFlagsをみて「このクラスに定義したOperationXという名前の全部のメソッドをテストするために使うコードなのかな?」と感じました。基底クラスからの継承メソッドを対象外にしていてその他のものはインスタンスメソッドであろうがstaticメソッドであろうが何でも呼び出すというふうになっていますので。もしそういう目的で実行時のInvokeのオーバーヘッドを気にしないというなら単純に以下のようでいいと思います。
2
2
 
3
3
  ```C#
4
4
  private void OperationCore(int command, string text) {