基本的にメッセージハンドラーであるクラスがあり、要求を受け入れ、そのメッセージタイプのプロセッサを見つけ、適切な応答を作成して返します。この目的のために、私は次のようにデリゲートを作成し、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();
}