【问题标题】:Return generic<object> collection on interface method without casting to object in implementation在接口方法上返回 generic<object> 集合,而不在实现中转换为对象
【发布时间】:2011-10-08 21:50:50
【问题描述】:

我正在考虑以通用/标准化的方式向我的 WCF Restful web 服务添加一些基本的搜索和过滤功能。

这个想法是客户端将 POST 一个 SearchRequest 到任何容器资源,即 /users 或 /sessions - 然后服务器应该为搜索结果构建一个 uri 并重定向到它们(POST-Redirect-GET 模式)。

我认为我需要这样做(接受建议)的方式是每个可搜索资源都应该实现我定义的接口。然后,该资源可以与我将创建的通用实用程序一起使用,只需几行代码即可实现。

我想出的界面是:

public interface ISearchable
{
    ChunkedList<object> GetAll(int chunkStart, int chunkEnd);

    ChunkedList<object> SearchByValue(string searchValue, int chunkStart, int chunkEnd);

    ChunkedList<object> SearchByValueWithFilters(string searchValue, List<string> filters, int chunkStart, int chunkEnd);
}

实现此接口的任何资源都可以进行优化搜索并限制结果集(分块列表具有对象集合和上一个/下一个块 uri)。

我遇到的问题是接口上有一个泛型 ChunkedList&lt;object&gt; 但实际实现想要返回 ChunkedList&lt;User&gt;ChunkedList&lt;Session&gt; 等,这给了我一个无效的强制转换异常。

我知道我可以使用 list.convert 将每个项目手动转换为一个对象,但是每个实现都必须这样做会很痛苦。

是否有更合适的接口或 OO 模式可用于此?例如,我可以使用基类实现“更清洁”的东西并从中派生可搜索资源吗?

【问题讨论】:

  • 我刚刚看到了这个stackoverflow.com/questions/7433279/… - 我想这就是我想要的,一个通用接口,但实现定义了类型。这在 c# 中可能吗?
  • ChunkedList&lt;object&gt; 非常没用。尝试将其设为 ISearchableChunkedList&lt;T&gt; 以保持真正的通用性。
  • 谢谢!我不知道我可以定义这样的通用接口:)如果您想将此作为答案发布,我会按照您的要求接受,否则我会标记 Yochai 的答案。
  • 你可以继续接受Yochai的回答。他有一个很好的例子:)

标签: c# oop generics interface


【解决方案1】:
public interface ISearchable<T>
{
    ChunkedList<T> GetAll(int chunkStart, int chunkEnd);

    ChunkedList<T> SearchByValue(string searchValue, int chunkStart, int chunkEnd);

    ChunkedList<T> SearchByValueWithFilters(string searchValue, List<string> filters, int chunkStart, int chunkEnd);
}

class myClass: ISearchable<myClass>
{
   ChunkedList<myClass> GetAll(int chunkStart, int chunkEnd);

   ChunkedList<myClass> SearchByValue(string searchValue, int chunkStart, int chunkEnd);

   ChunkedList<myClass> SearchByValueWithFilters(string searchValue, List<string> filters, int chunkStart, int chunkEnd);
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-12-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多