【问题标题】:Method delegate with optional parameter not working when called with a single parameter使用单个参数调用时,带有可选参数的方法委托不起作用
【发布时间】:2020-11-17 18:26:35
【问题描述】:

我有一个方法:

public delegate void SubscriberAction(string a, string b = null);

我的方法

public void Subscribe(SubscriberAction action)
{
    var consumer = new EventingBasicConsumer(Channel);
    consumer.Received += (model, eventArgs) =>
    {
        try
        {
            var body = eventArgs.Body;
            action?.Invoke(Encoding.UTF8.GetString(body), eventArgs.RoutingKey); 
            // The above works when I call it with one or two strings
        }
        finally
        {
            Channel.BasicAck(eventArgs.DeliveryTag, false);
        }
    };
    Channel.BasicConsume(Configuration.QueueName, false, consumer);
}

当我如上所示调用此操作时,它确实识别出可选参数,我可以按预期调用它。但是,采用此委托参数的 Subscribe 方法不会让我按照自己的意愿调用它。

所以这行不通:

subscriber.Subscribe(x =>
{
    // do stuff
});

只有在我这样做时才有效

subscriber.Subscribe((x, y) =>
{
    // do stuff
});

最初我使用Action<string> action 作为Subscribe 的参数,但需要添加一个可选的第二个字符串参数,并且由于Action 不允许可选参数(如果我错了,请纠正我),我找到了一个答案说像我上面所做的那样使用自定义委托。

如何使用一个或两个参数调用Subscribe 方法?

【问题讨论】:

  • 看来这是duplicate。简短的回答是调用委托需要所有参数;编译器“作弊”并在“正常”情况下为您插入额外的参数。但是当定义一个委托(例如创建一个lambda函数)时,所有的参数都是需要的。

标签: c# delegates optional-parameters


【解决方案1】:

返回Action<String, String>并添加另一个Subscribe方法:

public void Subscribe(Action<string> action) => Subscribe((x, y) => action(x));

【讨论】:

  • 好吧,正如肖恩凯利在他的评论中提到的,即使它是可选的,你也不能在没有参数的情况下创建委托,但是在你的 Subscriber 类中你可以有两个 Subscribe 方法 - 一对二参数函数,另一个(我写的)用于单参数函数,第二个版本只是将单参数函数包装成双参数并将其提供给通常的Subscribe。所以,所有的订阅逻辑都只在初始函数中,你可以同时使用 1 和 2 参数函数作为订阅
猜你喜欢
  • 1970-01-01
  • 2011-08-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多