具有不同返回类型的C#通用接口

ZNS*_*ZNS 7 c# generics interface

我有webservice,可以返回多种格式的数据.例如json和xml.我正在构建一个简单的C#api来对付这个web服务,我希望这些方法能够从json,raw json或raw xml返回完全序列化的对象.例如:

List<Order> GetOrders(int customerId)
string GetOrders(int customerId)
XMLDocument GetOrders(customerId)

Customer GetCustomer(int customerId)
string GetCustomer(int customerId)
XMLDocument GetCustomer(int customerId)
Run Code Online (Sandbox Code Playgroud)

我有一个关于做一个流畅的api的想法,你可以调用一个SetFormat()方法,然后返回上述方法的通用接口.但我仍然坚持该接口的样子,因为返回序列化对象的实现返回不同类型的对象.

另一个更简单的解决方案是只返回返回序列化对象的方法,然后像这样添加一个out参数:

List<Order> GetOrders(int customerId, out string data)
Run Code Online (Sandbox Code Playgroud)

但我认为这不是一个很好的解决方案....

UPDATE

我更喜欢Sjoerd建议的非通用解决方案,我过度复杂了我的问题.这就是我最终做的事情:

public class ServiceEntity {
    List<Order> GetOrders(int customerId)....
}    
public class ServiceJson {
    string GetOrders(int customerId)....
}
public class ServiceXml {
    XmlDocument GetOrders(int customerId)....
}
Run Code Online (Sandbox Code Playgroud)

然后像这样一个流畅的服务类:

public class Service : IService {
    ....
    public AsJson() { return new ServiceJson(); }
    public AsEntity() { return new ServiceEntity(); }
    public AsXml() { return new ServiceXml(); }
}
Run Code Online (Sandbox Code Playgroud)

像这样使用:

string json = Service.New().AsJson().GetCategories(1);
List<Order> = Service.New().AsEntity().GetCategories(1);
Run Code Online (Sandbox Code Playgroud)

感谢所有的答复!

Sjo*_*erd 3

尝试使用泛型固然很好,但泛型并不是灵丹妙药!

在这种情况下,我想知道与非泛型相比,您会节省多少代码:

List<Order> GetOrdersAsList(int customerId)
string GetOrdersAsString(int customerId)
XMLDocument GetOrdersAsXml(customerId)
Run Code Online (Sandbox Code Playgroud)

我敢打赌几乎没有!

如果您决定采用非通用方法,很可能最终会在内部得到:

List<Order> GetOrders(int customerId)
string OrdersToString(List<Order> orders)
XMLDocument OrdersToXml(List<Order> orders)
Run Code Online (Sandbox Code Playgroud)

然后,后两个方法可以移动到单独的类中,从而导致您GetOrders()与格式分离。

在我看来,这比在这种情况下尝试使用泛型更好、更干净的方法!

更新:不要误会我的意思,我喜欢泛型,并且在许多情况下它们使代码更具可读性。其他几个答案非常有趣,因为它们展示了实现这一目标的技术。所以我建议研究它们:它们在其他情况下可能有用。但在这种情况下,迄今为止提出的每个解决方案都有一个实际的缺点。这就是为什么我在这种情况下推荐非泛型。