如何通过Func将要执行的方法发送到C#中的另一个方法?

时间:2018-08-14 16:15:50

标签: c# rabbitmq

我有一个服务类,看起来像:

class BillingService
{
    public void CheckBillingStatus(BillingOperationRequestDto dto)
    {
    }

    public void AnotherOperationOnBillings(BillingOperationRequestDto dto)
    {
    }
}

我还有另一个类,它从RabbitMq监听一些队列。我想写这样的东西:

class MessageListener<T> where T : BaseDto {
        public void GetMessage<T>(Func ... )

        MessageListener<T>(string queueToListen)
        {
        }
}

此代码背后的想法是,我想将其用作:

BillingService bs = new BillingService();
var listener = new MessageListener<BillingOperationRequestDto>();

listener.GetMessage<BillingOperationRequestDto>(bs.CheckBillingStatus);

我不仅要指定队列中期望的数据,还要指定对该数据调用哪种方法。这是正确的方法吗?我本来打算只从队列中获取一条消息,然后再将数据发送给另一类,但没有找到解决办法,所以决定循环运行GetMessage并指定出现消息时应执行的操作。

更新#1.1: 有没有办法将委托发送到

listener.GetMessage<BillingOperationRequestDto>(bs.CheckBillingStatus);

如果我在BillingService类中的方法将具有不同的方法签名?例如,

public BillingStatusResult CheckBillingStatus(BillingOperationRequestDto dto)
{
}
public AnotherReturnValue AnotherOperationOnBilling(BillingOperationRequestDto dto, string requestedIp, TimeSpan period)
{
}

2 个答案:

答案 0 :(得分:4)

如@juharr所述,您可以使用通用委托(如果需要从委托中检索结果,则其类型为Private Sub Worksheet_SelectionChange(ByVal Target As Range) Dim r As Range Intersect(Columns("H"), ActiveSheet.UsedRange).Font.Color = vbBlack Set r = Intersect(Range("N:N"), Target) If r Is Nothing Then Exit Sub Cells(r.Row, "H").Font.Color = vbWhite Intersect(Columns("I"), ActiveSheet.UsedRange).Font.Color = vbBlack Set r = Intersect(Range("N:N"), Target) If r Is Nothing Then Exit Sub Cells(r.Row, "I").Font.Color = vbWhite End Sub Action<T>)。

您可以在this问题或documentation中找到更多信息

Func<T, TResult>

答案 1 :(得分:0)

Func<T, TResult>是返回结果的委托。您将要使用Action<T>,它不会返回结果。 Action<T>的通用类型参数必须与您要传递的方法的签名匹配。

通常,当使用来自消息队列的消息时,您将具有一个侦听器类,该类包装该消息队列的客户端,并且将在您的侦听器中处理MessageReceived事件(我一般地说-我(尚未与RabbitMQ一起专门使用)。因此您的听众可能看起来像这样(伪代码):

class MessageListener<T> where T : BaseDto {
    var _client = new QueueClient();

    MessageListener<T>(string queueToListen, Action<T> onMessageReceived)
    {
        _client = new QueueClient("<your_connection_string>", queueToListen);
        _client.MessageReceived += onMessageReceived;
    }
}

用法将是这样的:

BillingService bs = new BillingService();
var listener = new MessageListener<BillingOperationRequestDto>("myQueue", bs.CheckBillingStatus);