10

次のクラスがあります

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)

私は次のようなことをしようと思いました:

    _messageMapper = new Dictionary<Type, "what should be here ?" >();
    _messageMapper.Add(typeof(Heartbeat), "and how I put it here?" );

代わりに「ここに何があるべきか」と何を置くべきですか?そして「そして私はそれをここにどのように置くのですか?」

ありがとう

4

3 に答える 3

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

var cVisitor = new CVisitor();
_messageMapper.Add(typeof(Heartbeat), 
   new Func<object, int>(heartbeat => cVisitor.Visit((Heartbeat)heartbeat)) 
);
于 2012-07-16T12:09:19.723 に答える
3

ActionオブジェクトとFuncオブジェクトを知っていますか?あなたが探しているもののようです。

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

PS:thx YAG

于 2012-07-16T12:08:00.063 に答える
1

ここでの最善の呼び出しは、Reflectionを使用することです。
1. typeof(Visitor).GetMethods()を使用して、Visitorクラスのすべてのメソッド(または「Visit」と呼ばれるすべてのメソッド?)を取得します。
2. GetMethodsは、MethodInfoのIEnumerableを返します。GetParametersは、各メソッドのパラメーターを提供します。
3.これで、(Type、MethodInfo)の辞書を作成できます。4。Invokeを
使用してメソッドを呼び出します。

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

于 2012-07-16T12:25:01.820 に答える