2012-07-16 12 views
7

クラス辞書、私は以下のいる

public class CVisitor : IVisitor 
    { 
     public int Visit(Heartbeat element) 
     { 
      Trace.WriteLine("Heartbeat"); 
      return 1; 
     } 
     public int Visit(Information element) 
     { 
      Trace.WriteLine("Information"); 
      return 1; 
     } 

    } 

私は、すべての引数の型がそれにマッピングされることを、マッピングで辞書を持ちたいが、実装の機能です:ハートビートがpublic int Visit(Heartbeat element)

にマップされます

代わりに「ここにあるべきもの」とは何ですか?そして、「どうやってここに置いたの?」

おかげ

+1

あなたのメソッドはどのように見えますか(つまり、それらの定義は似ていますか?) –

+0

多分、デリゲートとしてメソッドを作成でき、辞書のTValueはSystem.Delegateになります。 –

+0

@別のオタク、Visitor関数は全く異なる実装を持っています。彼らはDTOマッパーです –

答えて

7
new Dictionary<Type, Func<object, int>>(); 

var cVisitor = new CVisitor(); 
_messageMapper.Add(typeof(Heartbeat), 
    new Func<object, int>(heartbeat => cVisitor.Visit((Heartbeat)heartbeat)) 
); 
+0

なぜあなたはActionを使用していますか?私は戻り値を持っています –

+0

cVisitorがCVisitorのインスタンスであれば、新しいFuncで登録する方法(ハートビート=>(cVisitor.Visit(ハートビート)) –

+1

@NightWalkerは現在のバリアントをチェックします –

2

あなたはActionFuncオブジェクトを知っていますか?あなたが探しているもののように見えます。

var d = new Dictionary<Type, Action>(); 
d.Add(typeof(HeartBeat),()=>Trace.WriteLine("todum todum")); 

PS:THX YAG

+1

このようにしたいのであれば、それは 'Action'でなければならず、' Action 'という文字列が入力されていないので、 –

0

ここにあなたの最良の呼び出しはリフレクションを使用することです。
1. typeof(Visitor).GetMethods()を使用してVisitorクラスのすべてのメソッド(または「Visit」と呼ばれるすべてのメソッド)を取得します。
2. GetMethodsは、MethodInfoのIEnumerableを返します。 GetParametersは各メソッドのパラメータを提供します。
3.これで、(Type、MethodInfo)Dictionnaryを構築することができます。 4.メソッドを呼び出すためにInvokeを使用します。

Rq:リフレクションを使用する利点は、新しいメソッドを追加するとDictionnaryが最新の状態になることです。メソッドを追加することを忘れるリスクはありません。

関連する問題