【问题标题】:Containership Question集装箱船问题
【发布时间】:2010-09-12 13:50:36
【问题描述】:

考虑这个例子:

namespace ValueObjects
{
  public class User
  {
    public string UserCode { get; set; }
    public string UserName { get; set; }
  }

  public class Company
  {
    public string CompanyCode { get; set; }
  }
}

现在,我希望 User 类具有 CompanyCode 属性.. 第一个明显的解决方案 只是简单地将 CompanyCode 属性放在 User 类上

public class User
{
  public string UserCode { get; set; }
  public string UserName { get; set; }
  public string CompanyCode { get; set; }
}

现在这里的问题是冗余,因为公司类已经有一个属性 CompanyCode,有没有什么方法可以让用户只使用公司的 CompanyCode 属性而不继承公司类(这里的问题是 C# 不允许多重继承类)或使用 ICompany 接口(但接口在值对象中很痛苦)。 我正在考虑将 Company 类包含到 User 类中,但我将只使用它的属性 CompanyCode。

类似的东西..

  public class User
  {
    public string UserCode { get; set; }
    public string UserName { get; set; }
    private Company company;
    public string CompanyCode { get { company.CompanyCode } set {company.CompanyCode }

  }

但是,只是添加一个字符串属性 CompanyCode.. 并没有什么区别。 需要你们的建议。提前谢谢..

【问题讨论】:

    标签: c# value-objects data-transfer-objects


    【解决方案1】:

    您的解决方案是有效的。你想要遏制; “具有”关系而不是“是”关系(继承)。另一种选择是

    public Company UserCompany;
    

    这将使 User 对象能够访问 Company 对象上的其他公共属性(如果将来添加它们)。

    【讨论】:

    • 问题是,当我将 Company 类设为 User 的属性时 - public Company UserCompany { get;放; } - 并将用户放入集合中(例如 Collection 用户)并将其绑定到 Gridview。 Gridview 的 Boundfield 不会让您访问包含的类的属性...
    • @CsharpNoob 确实,objectdatasource/asp.net 简单的数据绑定无法通过复杂的类。看这里:codeproject.com/KB/database/CustomBindableObject.aspx
    • 有什么解决办法吗?我正在使用 DTO 及其讨厌的东西,在我的值对象中看到太多 CompanyCode 属性..
    • @CSharpNoob,我知道我会为此而受挫。但是使用 WinForms,我几乎避免了数据绑定。除了简单的情况外,我只会遍历列表并将项目添加到控件中。在这方面,WPF 和相关技术要强大得多,充分利用数据绑定基础设施是明智之举,但对于 WinForms,它并不总是像人们希望的那样顺利运行。
    • 我认为您可以访问包含类的属性,例如“User.UserCompany.CompanyCode”。我认为这有效(至少在 DataGrids 上有效)。如果没有,你可以使用模板(ItemTemplates)msdn.microsoft.com/en-us/library/aa479353.aspx
    猜你喜欢
    • 1970-01-01
    • 2011-05-29
    • 2017-03-05
    • 1970-01-01
    • 2015-09-11
    • 1970-01-01
    • 2018-06-20
    • 2020-11-21
    相关资源
    最近更新 更多