我正在尝试在C#
中实现一个JsonRpc客户端类,每当响应JsonRpc时执行给定的method
/ delegate
/ callback
(解释为什么我需要我要问的事情。)
为此,我想要一个方法来注册任意类型的回调(任意参数列表)。只要响应到达,就会调用/评估此回调。这意味着在注册时,无论回调是什么,它都会被接受,并且在执行时它的类型可能会导致异常,一旦用响应的类型进行检查。
我见过代码实现了类似的概念:
//Defining a delegate based on a method signature
Delegate d = Delegate.CreateDelegate(delegate_type, context, methodInfo);
//Executing the delegate when response arrives
d.DynamicInvoke(parameters);
如果我要实现相同的功能,我需要做的就是接受Delegate
类型的参数来注册回调。但这对我没有用,因为我希望注册回调比创建它的Delegate
要容易得多(需要十几行来提出方法的Delegate
)。
最后,我的问题是:
如何在C#
?
[UPDATE]
或许有人可以想出一个简单的方法来创建方法的Delegate
!
答案 0 :(得分:1)
当你说消费者需要“创建Delegates
”时,我不确定你的意思。这是我提出的一个例子,它可以很好地工作,对你的方法的消费者来说似乎并不难。
private static void HigherOrderFoo(Delegate foo)
{
var returnVal = foo.DynamicInvoke(null);
}
private static void Bar()
{
HigherOrderFoo((Func<int>)(() => 10));
}
同样,lambda函数也可以是一个方法组,并且将其转换为委托类型也可以。
private static void HigherOrderFoo(Delegate foo)
{
var returnVal = foo.DynamicInvoke(null);
}
private static void Bar()
{
HigherOrderFoo((Func<int>)Baz);
}
private static int Baz()
{
return 10;
}
另外,here's是Jon Skeet的一个很好的答案,它解释了为什么需要将参数转换为实际的委托类型以便将其转换为Delegate
。
编辑:如果您作为参数传入的方法具有自己的参数,则可以使用params
关键字将参数传递给HigherOrderFoo
。
private static void HigherOrderFoo(Delegate foo, params object[] list)
{
var bar = foo.DynamicInvoke(list);
}
private static void Bar()
{
HigherOrderFoo((Func<int, int>)Baz, 10);
}
private static int Baz(int val)
{
return val * val;
}