gpt4 book ai didi

c# - 如何避免使用第 3 方 Web 服务的代码重复 - 不使用动态?

转载 作者:行者123 更新时间:2023-12-03 19:30:17 25 4
gpt4 key购买 nike

我正在使用第 3 方 Web 服务,它的所有方法都具有以下签名:

SomeResponseClass SomeMethod(SomeRequestClass request)

每个方法都有它自己的请求类和它自己的响应类,但是所有请求和所有响应都有一些共同点。

每个请求类都有一些属性用于标识:usernametoken,每个响应类都有一些属性来指示是否有错误:状态错误

我正在寻找一种优雅的方法来创建一个实例化我的请求的方法 - 这样我就不必在调用服务的每个方法中重复自己。由于我无法更改这些类,并且所有这些类都没有公共(public)接口(interface)或基类,我找到的唯一解决方案是使用 dynamic:

private T CreateRequest<T>() where T : new()
{
if(string.IsNullOrEmpty(_Token))
{
Login();
}
// this has to be dynamic for the next 2 rows to pass compilation.
dynamic request = new T();
request.username = _UserName;
request.token = _Token;
return (T)request;
}

还有类似于从服务响应中填充我自己的实体的东西:

// response have to be dynamic for getting the error and status properties
private static T CreateServiceResponse<T>(dynamic response) where T : ServiceResponse, new()
{
T result = new T();
result.Error = (response == null) ? "Service response is null" : response.error;
result.Status = (response == null) ? -1 : response.status;
return result;
}

(此方法在我用来使用服务响应的数据填充我的实体(全部派生自 ServiceResponse)的每个方法中使用。)

有没有什么方法可以不使用dynamic 来做这样的事情?对我来说,这有点像使用肮脏的 hack...

如果我能以某种方式为所有要实现的请求“注入(inject)”一个通用接口(interface),为所有要实现的响应“注入(inject)”一个通用接口(interface),我可以使用简单的泛型,但我想这是不可能的,或者是这样?

最佳答案

当您使用由 visual studio 创建的服务引用时,所有生成的类都被标记为部分。这意味着您可以使用自己的代码扩展它们。在您的情况下,这将是一个提供重复属性的接口(interface)。您可以将该接口(interface)用作通用约束。

您首先创建通用接口(interface)。为方便起见,您对服务引用中定义的公共(public)属性使用相同的名称和类型:

interface IRequest {
string username { get; set; }
string token { get; set; }
}

然后您创建一个代码文件,并在与服务引用相同的命名空间中为每个服务请求类(具有相同的名称)定义一个分部类。这些类中的每一个都实现了您的接口(interface):

partial class SomeRequestClass : IRequest {}

选择相同的属性名称和类型后,您不必专门实现接口(interface)。

最后你使用通用约束:

private T CreateRequest<T>() where T : IRequest, new()
{
if(string.IsNullOrEmpty(_Token))
{
Login();
}
T request = new T();
request.username = _UserName;
request.token = _Token;
return request;
}

关于c# - 如何避免使用第 3 方 Web 服务的代码重复 - 不使用动态?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47315409/

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