如何推广具有相同结构但属性名称不同的类?

时间:2012-11-17 12:16:29

标签: c# architecture

我在Windows窗体应用程序上使用的数据库有很多表,包括主键int标识字段,varchar描述和与另一个表的一对一关系,其中id和描述是使用

使用Entity Framework Code First映射到数据库的C#POCO的一个示例是:

public class OtherClass
{
  public int Id { get; set; }
  public string Description { get; set; }
}

public class Foo
{
  public int Id { get; set; }
  public string Description { get; set; }
  public OtherClass OtherClassProperty { get; set; }
}

因为像“Foo”这样的类都共享相同的结构,所以我创建了一个基本表单,应该能够处理所有类这样的类。

我的问题是所有这些类的Id和Description都有不同的属性名称(例如,有时称为Name)。更不用说他们引用的其他课程总是不同。

我的第一个想法是创建一个需要实现具有固定名称的属性的接口:Id,Description,KeyId,KeyDescription。这些属性将在每个类上实现,但仅指向“真实属性”。像这样:

public class Foo : MyInterface
{
  public int Id { get; set; }
  public string Description { get; set; }
  public OtherClass OtherClassProperty { get; set; }  

  //Interface implementation
  public int CommonId { get { return this.Id; } set { this.Id = value; } }
  public int CommonDescription { get { return this.Description; } set { this.Description = value; } }
  public int CommonKeyId { get { return this.OtherClassProperty.Id; } set { this.OtherClassProperty.Id = value; } }
  public int CommonKeyDescription { get { return this.OtherClassProperty.Description; } set { this.OtherClassProperty.Description = value; } }
}

我的印象是可能有更好的解决方案。我还可以想象实现属性属性并使用反射在运行时检查并获取属性。

有人会对这种情况提出建议吗?

提前致谢。

2 个答案:

答案 0 :(得分:1)

对我而言,它看起来是一个很好的实现。

这是直截了当且易于理解的。

但是我会考虑使用显式接口实现

public int MyInterface.CommonId { get { return this.Id; } set { this.Id = value; } }

而不是

public int CommonId { get { return this.Id; } set { this.Id = value; } }

如果可能的话,我还会创建一个长期的架构目标来重构数据库以统一命名。

答案 1 :(得分:1)

固定名称听起来像是一个好方向。请查看Adapter pattern以获得更正式的方法。