我正在尝试弄清楚如何在运行时动态创建一个动作,但结果很短。
假设我想调用一个方法并传入一个动态创建的动作,这样我就可以跟踪是否调用了动作等(无论出于何种原因)。
void DoSomething(Action<string> action);
这就是我要调用的方法,我想以某种方式动态构建一个满足参数的 Action。
我知道我可以使用new Action<string>((s) => { });
但是对于这种情况,我在编译时不知道 Action 的签名,我想要的只是一个超级通用的 Action,它会让我知道它是否被调用。
这是项目通信系统的一部分,我希望能够支持可用的操作(想想 OnCompleted 回调)。
Proxy.DoSomething((s) => Console.WriteLine("The server said: " + s);
我希望能够生成一个表示,通过网络拍摄,在服务器上动态创建一个动作,调用对象上的方法并传入我的动态动作,将结果发送回客户端并在那里调用实际动作.
一点澄清:
客户端:
var proxy = GetProxyObject(); // Comms proxy
proxy.DoSomething((reply) => Console.WriteLine("Server said: " + reply));
下:
- 发现动作的签名
- 构建一个内部表示对象(很简单)
- 通过网络将其发送到服务器
服务器端:
void ReceivedMessage(msg)
{
var actParam = msg.Parameters[0]; // This is obviously just for demonstration
var action = BuildActionWrapper(actParam);
var result = target.InvokeMethod("DoSomething", action.UnderlyingAction);
// Send result and Action result back to client
ReplyToClient(...);
}
void DoSomething(Action<string> act)
{
act("HELLO!");
}
然后回到客户端,将参数传递给服务器上动态生成的动作,真正的动作只是被这些参数调用。