如何将通用动作委托转换为具体动作委托?

How to cast generic action delegate to concrete action delegate?

我正在实施基于订阅的 IBM MQ websphere 消息读取,我正在使用 IBM.XMS.dll,它具有基于事件的机制。以下是我的订阅代码:

T是回调函数onMessageReceived接受的数据类型。我将不得不从 IMessage 解析消息正文,转换为类型 T 并从 OnMQMessageCallback

调用 onMessageReceived
    public override void Subscribe<T>(Action<T> onMessageReceived)
    {
        try
        {
            MessageListener messageListener = new MessageListener(OnMQMessageCallback);
            _consumer.MessageListener = messageListener;

            _connection.Start();
        }
        catch (Exception ex)
        {
            throw;
        }
    }

    private void OnMQMessageCallback(IMessage msg)
    {
        try
        {
            //I want to invoke onMessageReceived in this method
        }
        catch (Exception)
        {
            throw;
        }
    }

OnMQMessageCallback,我想调用从调用方传递到 Subscribe() 方法的 onMessageReceived()。我不知道该怎么做。

您可以使用 anonymous delegate

实现此目的
   MessageListener messageListener = new MessageListener((m) =>         
    try
    {
        onMessageReceived();
    }
    catch (Exception)
    {

        throw;
    });`

如果 onMessageReceivedSubscribe 的范围之外定义 Action<T>,则无法调用它。你根本不知道T是什么。

要么你这样做,然后让调用者稍后处理解析:

public override void Subscribe(Action<IMessage> onMessageReceived)
{
    MessageListener messageListener = new MessageListener(onMessageReceived);
    _consumer.MessageListener = messageListener;

    _connection.Start();
}

或者你自己解析它(不知道如何)并调用它:

public override void Subscribe<T>(Action<T> onMessageReceived)
{
    MessageListener messageListener = new MessageListener((m) =>         
    {
        T result = (T) m.Body; // or some other casting
        onMessageReceived(result);
    });`

    _consumer.MessageListener = messageListener;

    _connection.Start();
}

不再需要 OnMQMessageCallback

旁注:try..catch..throw 没有意义,这与根本不做 try..catch 是一样的。