gpt4 book ai didi

常见的 C# 泛型类型推断

转载 作者:行者123 更新时间:2023-11-30 21:47:43 25 4
gpt4 key购买 nike

我必须使用我无法控制的特定 API:

TResponse Request<TRequest, TResponse>(TRequest request) 
where TRequest : class
where TResponse : class;

这是 EasyNetQ 库中 RabbitMq 的 RPC 包装器

我想有一些方法来定义 TRequest 到 TResponse 的关系,这样我就不必像这样每次调用都手动匹配它们:

this._client.Request<CancelPaymentByMerchantRequest, CancelPaymentByMerchantResponse>(request);

我想出的解决方案是:

public interface ICommand<TRequest, TResponse> { }

public class StartCommand : ICommand<StartCommand, StartResponse>
{
public int Id { get; set; }

public string Args { get; set; }
}

public class StartResponse
{
public bool Success { get; set; }

public string Error { get; set; }
}

以及它的消费者:

 public TResponse Send<TRequest, TResponse>(ICommand<TRequest, TResponse> payload)
where TRequest : class
where TResponse : class
{
var result = client.Request<TRequest, TResponse>((TRequest)payload);
return result;
}

是否可以去掉 ICommand 标记接口(interface)上的 TRequest 类型?

我还担心与标记接口(interface)相关的额外成本,然后在实际的库调用中直接从它转换。

如有任何建议,我们将不胜感激。

最佳答案

实现这一点的最简单方法就是为每个 TRequest 类型添加一次围绕 Send 的抽象:

public SpecificResponse Send(SpecificRequest payload)
{
return Send<SpecificRequest, SpecificResponse>(payload);
}

您必须为每个 TRequest、TResponse 对定义 Send 的重载,然后您的应用程序的其余部分可以使用这些“强类型”版本来避免不得不到处重申这种关系。

你如何编排这取决于你,但我更喜欢每个请求/响应类型的接口(interface)/类充当通用层的中介(或者一个带有一堆契约(Contract)的大接口(interface)就像好吧)。

关于常见的 C# 泛型类型推断,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38179229/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com