【问题标题】:UserControl inheritance with generic DTO interface具有通用 DTO 接口的 UserControl 继承
【发布时间】:2015-12-19 05:25:02
【问题描述】:

我有以下问题:

我想要以下物品:

  • 几个 DTO,例如。 G。为员工、客户等提供服务。
  • 多个用户控件,每个 DTO 一个(或多个)显示 DTO 内容并提供用户可能对 DTO 所做的修改。
  • 这些用户控件的基类提供了一些默认功能。
  • 具有 CRUD 操作的标准按钮面板应该适用于我的所有用户控件。

到目前为止我所做的是:

  • 我有一个用于 DTO 的抽象基类和几个特殊的 DTO 类。
  • 我的默认按钮事件处理程序中有标准功能。例如:保存按钮向用户控件询问当前数据(通过 DTO),将数据传递给某个检查类,如果所有检查都通过,则将数据存储在数据库中。要检索数据,需要通过构造函数设置对客户端对象的引用。
  • 我的用户控件有一个基类。这不是抽象的,因为我想得到设计师的支持。因此,此类基于 DTO 的抽象基类,通过虚拟方法提供对其控件的访问/访问。
  • 我有一个基于特定 DTO 类型的通用接口,它定义了具有相同方法名称的数据访问。
  • 现在我创建一个新的用户控件,继承自我的用户控件基类,并为合适的 DTO 类实现通用接口。因此,BaseDTO GetData()new SpecialDTO GetData() 方法覆盖。

这是我的问题:

  • 在我的事件处理程序中,客户端控件是我想要的类型,例如。 G。客户客户端控件。但是调用的方法不是new CustomerDTO CustomerClientControl.GetData(),而是基本的默认实现BaseDTO BaseClientControl.GetData()

我怎样才能摆脱困境?感谢您提供任何帮助或建议,以使整个构造更美观。

编辑:这是一些代码。

// in my "standard functionality"
BaseClient Client { get; } // or IClientDataAccess<BaseDTO>
void ButtonSave()
{
    var data = this.Client.GetData(); // in runtime, this.Client is CustomerClient
    // the following works, don't worry. :-)
    if (this.CheckLogic.CheckData(data))
    {
        this.DataAccess.SaveData(data);
    }
}

public interface IClientDataAccess<T> where T : BaseDTO
{ T GetData(); }

public BaseClient : UserControl, IClientDataAccess<BaseDTO>
{ 
    public virtual BaseDTO GetData() 
    { 
        return new BaseDTO(); // some stupid default
    }
}

public CustomerClient : BaseClient, IClientDataAccess<CustomerDTO>
{
    public new CustomerDTO GetData()
    {
        // CustomerDTO : BaseDTO
        return new CustomerDTO(this.CustomerNameTextbox);
    }
}

【问题讨论】:

  • 你能显示调用方法的代码吗?
  • @stuartd:代码示例见上文。谢谢。

标签: c# generics dto


【解决方案1】:

覆盖时不能更改函数签名。
这意味着您不能进行此转换public BaseDTO GetData() -&gt; public CustomerDTO GetData()
所以你需要将 CustomerClient 更改为

public CustomerClient : BaseClient
{
    public override BaseDTO GetData()
    {
        // CustomerDTO : BaseDTO
        return new CustomerDTO(this.CustomerNameTextbox);
    }
}

或寻找其他类设计。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-01-05
    • 2021-01-24
    • 1970-01-01
    • 2015-10-03
    • 2010-12-23
    • 2010-09-17
    • 2022-01-25
    相关资源
    最近更新 更多