【问题标题】:Accepting callbacks of arbitrary type接受任意类型的回调
【发布时间】:2013-09-12 13:50:21
【问题描述】:

我正在尝试在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# 中注册任意类型的回调?

[更新]

或者也许有人可以想出一个简单的方法来创建方法的Delegate!?

【问题讨论】:

    标签: c# callback json-rpc


    【解决方案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;
    }
    

    【讨论】:

    • 您能否更新您的答案,以便Baz 接受参数?如果这些不是static 方法怎么办?
    • 更新了我的答案,我认为静态方法并没有真正改变任何东西。
    • 你是对的,它没有(令我惊讶)。谢谢一百万。
    • 没问题,很高兴能帮上忙!
    猜你喜欢
    • 2014-02-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-07-17
    • 1970-01-01
    相关资源
    最近更新 更多