如何将通用动作委托转换为具体动作委托?
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;
});`
如果 onMessageReceived
在 Subscribe
的范围之外定义 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
是一样的。
我正在实施基于订阅的 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;
});`
如果 onMessageReceived
在 Subscribe
的范围之外定义 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
是一样的。