5

基本的にメッセージハンドラーであるクラスがあり、要求を受け入れ、そのメッセージタイプのプロセッサを見つけ、適切な応答を作成して返します。この目的のために、私は次のようにデリゲートを作成し、public delegate Rs ProcessRequest<Rq,Rs>(Rq request);次にクラス内に、サポートされている多数のメッセージとそのプロセスメソッドを作成しました。問題は、使用するプロセスメソッドがGetMethod()メソッドを使用してメソッドを見つけることができないことを把握する必要があるメインプロセスメソッドです。

これがコード全体です。適切なメソッドを動的に選択して実行する方法を教えていただければ、それが私が探しているものとほぼ同じです。

public delegate Rs ProcessRequest<in Rq, out Rs>(Rq request) where Rq : API.Request where Rs : API.Response;

public class WebSocketServer
{
    private WebSocketMessageHandler messageHander;

    // Incoming message handlers
    public ProcessRequest<InitUDPConnectionRq, InitUDPConnectionRs> ProcessInitUDPConnection;
    public ProcessRequest<ListenHandshakeRq, ListenHandshakeRs> ProcessListenHandshake;
    public ProcessRequest<PresenceChangeRq, PresenceChangeRs> ProcessPresenceChange;
    public ProcessRequest<ChatMessageRq, ChatMessageRs> ProcessChatMessage;
    public ProcessRequest<RDPRequestResponseRq, RDPRequestResponseRs> ProcessRDPRequestResponse;
    public ProcessRequest<RDPIncomingRequestRq, RDPIncomingRequestRs> ProcessRDPIncomingRequest;

    public WebSocketServer(WebSocketMessageHandler handler)
    {
        this.messageHander = handler;
    }

    public void processRequest(API.Request request)
    {
        String resquestType = request.GetType().Name;
        String processorName = resquestType.Substring(0, resquestType.Length - 2);
        API.Response response = null;
        // Do we have a process method for this processor
        MethodInfo methodInfo = this.GetType().GetMethod("Process" + processorName);
        if (methodInfo != null)
        {
             // Execute the method via Invoke...., but code never gets here
        }
        else
        {
            logger.Warn("Failed to find a processor for " + processorName);
            response = new ErrorRs(request.id, "Failed to find a processor for " + processorName);
        }
        sendResponse(response, request);
    }
}

今、私はこれらのフィールドをメソッドに割り当てていますが、動的に実行することはできません。

// Link into the hooks so we can receive requests
_appContext.ConnectionManager.Connection.webSocketServer.ProcessInitUDPConnection = ProcessInitUDPConnection;
_appContext.ConnectionManager.Connection.webSocketServer.ProcessListenHandshake = ProcessListenHandshake;
_appContext.ConnectionManager.Connection.webSocketServer.ProcessPresenceChange = ProcessPresenceChange;
_appContext.ConnectionManager.Connection.webSocketServer.ProcessChatMessage = ProcessChatMessage;

// 1 method as an example
private PresenceChangeRs ProcessPresenceChange(PresenceChangeRq request)
{
    _appContext.RosterManager.presenceChange(request.user, request.presence);
    return new PresenceChangeRs();
}
4

1 に答える 1

1

使用法のサンプルコードを次に示しDictionaryます。カスタムタイプが多すぎて、完全にコンパイルされてテストされていることを確認できませんが、正しい方向に進むはずです。

public class WebSocketServer
{
    private WebSocketMessageHandler messageHander;

    // Incoming message handlers
    private Dictionary<string, System.Delegate> ProcessHandlers = new Dictionary<string, System.Delegate>();

    public void RegisterProcessHandler(string name, System.Delegate handler)
    {
        ProcessHandlers.Add(name, handler);
    }

    public void processRequest(API.Request request)
    {
        String resquestType = request.GetType().Name;
        String processorName = resquestType.Substring(0, resquestType.Length - 2);
        API.Response response = null;

        string processorName = "Process" + processorName;

        if (ProcessHandlers.ContainsKey(processorName))
        {
            System.Delegate myDelegate = ProcessHandlers[processorName]; 
            response = (API.Response)myDelegate.DynamicInvoke(request);
        }
        else
        {
            logger.Warn("Failed to find a processor for " + processorName);
            response = new ErrorRs(request.id, "Failed to find a processor for " + processorName);
        }

        sendResponse(response, request);
    }
}

登録:

var webSocketServer = _appContext.ConnectionManager.Connection.webSocketServer;
webSocketServer.RegisterProcessHandler("InitUDPConnection", ProcessInitUDPConnection);
webSocketServer.RegisterProcessHandler("ListenHandshake", ProcessListenHandshake);
于 2012-11-19T17:02:47.510 に答える