【问题标题】:Generic interface problem通用接口问题
【发布时间】:2011-01-26 07:35:13
【问题描述】:

我希望为所有与网格相关的任务提供一个接口。这些任务实现了这个接口:

public interface IDataForGrid<T>
{
    IGridResponse<T> GetList(IGridRequest request);
}

T 类型始终是 DTO 类。我不能为这个 DTO 创建一个通用接口,因为它们没有任何共同点。只是一个具有特定属性的愚蠢 DTO。

我想这样使用它:

public class Service1
{
    public IGridResponse CreateResponse(IGridRequest request)
    {

        ...
        IDataForGrid<T> aa;

        if(request == 1) aa = new CustomerGridData;
        if(request == 2) aa = new OrderGridData;

        var coll = aa.GetList();
    }
}

public class CustomerGridData : IDataForGrid<CustomerDTO>
{
   ...
}

问题是我不知道该放什么来代替 T。

【问题讨论】:

标签: c# .net interface application-design


【解决方案1】:

您也可以将方法设为泛型,以便根据需要替换 T:

public class Service1
{
  public IGridResponse<T> CreateResponse<T>(IGridRequest request)
  {
    ...
    IDataForGrid<T> aa;

    if(request == 1) cg = new CustomerGridData;
    if(request == 2) og = new OrderGridData;

    var coll = aa.GetList();
  }
}

【讨论】:

    【解决方案2】:

    也许我不理解你,但你不能做一个超级类,你所有的 DTO 都喜欢BaseDTO

    然后像这样使用它:

    public class CustomerDTO : BaseDTO {}
    
    IDataForGrid<BaseDTO> aa;
    
    var coll = aa.GetList();
    

    这样,您的 coll 变量将属于 IGridResponse&lt;BaseDTO&gt; 类型,您的所有 DTO 对象都从该类型扩展。

    这有意义吗?

    【讨论】:

    • 是的,你理解得很好。但是在基类中放什么? DTO 没有什么共同点。
    • 从技术上讲,你不需要基类中的任何东西,尽管那里什么都没有,感觉很奇怪。但是,如果这是在代码的其他更详细区域中获得成功的成本,那就这样吧。很有可能在未来你的 DTO 最终会有一些共同点,他们通常会这样做:)
    • 投射时不会出现投射异常吗? IDataForGrid aa = new CustomerDataGrid();
    猜你喜欢
    • 2018-09-05
    • 2020-09-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-30
    • 1970-01-01
    • 2013-01-23
    相关资源
    最近更新 更多