【问题标题】:Invoke Func with unknown return type调用具有未知返回类型的 Func
【发布时间】:2018-10-05 10:51:06
【问题描述】:

我正在尝试调用下面的 Func,但我想要 ???部分在调用时填写。

    public void Publish(string topic)
    {
        ...

        // 'actions' is a List of delegates, defined as List<Delegate>

        for (int i = 0; i < actions.Count; i++)
        {
            ((Func<???>)actions[i])(); // Invokation
        }

        ...
    }

操作是这样添加的:

    public void Subscribe<T>(string topic, Func<T> action)
    {
        ...

        actions.Add(action);

        ...
    }

问题是我不知道什么???将是(因此我的问题)。可能是布尔值,字符串,整数,......我该怎么做呢?我可以以某种方式基于要调用的操作的返回类型吗?

【问题讨论】:

  • 欢迎来到 SO。您能否也请提供actions 所在的代码?谢谢
  • 你打算如何处理委托的返回值?
  • 如果你按照代码中显示的方式调用动作,即((Func&lt;???&gt;)actions[i])(),返回类型是void(因为你没有使用动作的结果),你应该使用@ 987654326@ 作为actions IList 的类型。此外,在这种情况下,您不需要在调用动作时施放任何东西,即actions[i]() 就足够了。
  • 目前我不打算对代表的实际返回类型做任何事情,它们只需要被调用。将作为订阅方法中的操作添加的函数没有参数,但可以有任何返回类型。
  • 使用actions[i].DynamicInvoke(null),看看它是否符合您的要求。问题:您是否需要返回类型?你调用参数action,返回值是多少?看来你会忽略它,你为什么有它?

标签: c# delegates func


【解决方案1】:

所以,最终设法使用上面的Lasse Vågsæther Karlsen's 评论解决了这个问题。所以不是

((Func<???>)actions[i])();

我通过写来调用动作

actions[i].DynamicInvoke(null);

正确调用了委托。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-11-10
    • 2016-10-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多