gpt4 book ai didi

c# - 在 C# 中使用相同布局强制不同命名空间中的类型

转载 作者:可可西里 更新时间:2023-11-01 08:21:45 25 4
gpt4 key购买 nike

我已经开始为 FedEx 的网络服务 API 编写接口(interface)。他们有 3 个我感兴趣的不同 API;费率、运送和跟踪。我正在使用 SvcUtil.exe 生成服务代理。

不同的服务端点均由 FedEx 在其自己的 WSDL 文件中指定。每个服务端点都有自己的 xml 命名空间(例如 http://fedex.com/ws/rate/v5http://fedex.com/ws/ship/v5 )

服务端点确实使用了很多相同的类型,例如 Address、Measurements、Weight、AuthenticationDetail、ClientDetail 等...

这就是问题所在,我可以同时向 SvcUtil.exe 提供所有 WSDL 文件,通常它会将任何相同的类型合并为一个共享类型,但由于 FedEx 的每项服务都是它们自己的命名空间,并且他们在该命名空间下的每个 WSDL 文件中重新声明这些类型,我最终得到的是每个命名空间对应的地址、地址 1 和地址 2。

为了解决这个问题,我现在要做的是分别通过 svcutil 运行每个 WSDL,并将它们分别放在自己的 .NET 命名空间中(例如 FedEx.Rate、FedEx.Ship、FedEx.Track)。这样做的问题是,现在我在每个 namespace (Fedex.Rate.Address、FedEx.Ship.Address)中都有不同的地址类型。

这使得像 GetAuthenticationDetail() 工厂方法一样难以概括服务之间使用的代码,因此我不必在使用不同服务的每个地方都重复该代码。

在 C# 中有什么方法可以将 FedEx.Rate.Address 强制转换为 FedEx.Ship.Address?

最佳答案

如果类型相同,并且您可以控制源类,则可以定义 conversion operator在类中,任何采用 Rate.Address 的函数也将自动采用 Ship.Address。例如:

namespace Rate {
class Address {
string Street;
string City;
// ...

public static implicit operator Ship.Address(Rate.Address addr) {
Ship.Address ret;
ret.Street = addr.Street;
ret.City = addr.City;
// ...

return ret;
}
}
}

我的 C# 有点生疏,但我希望你能理解。

关于c# - 在 C# 中使用相同布局强制不同命名空间中的类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/562517/

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