我有一个包含很多功能的类,称为Record. 在系统中存在两种基本类型的记录,它们的主键是uint,主键是Guid。
该类Record包含我需要的所有功能,除了一个属性。Record.ID允许开发人员将当前主键读取为正确的类型(uint或Guid)。
为了实现这一点,我必须创建三个这样的类(简化示例):
class Record {
    ... lots of code ...
}
class RecordInt : Record {
     public uint ID { get; set; }
}
class RecordGuid : Record {
     public Guid ID { get; set; }
}
这工作正常,但它引入了一个问题,即数据模型不能只创建一个通用Record实例。他们必须知道派生类是否期望RecordInt或RecordGuid. 所以我为这样的模型添加了一个模板参数。
class abstract class Model<T> : were T : Record, new()
{
   ... lots of generic code that uses T ...
   // example
   public List<T> Find(...) { 
      .. find a record ...
      return new List<T>(); 
   }
}
这给我带来的问题不仅仅是拥有两种Record类型的好处。现在,当我实例化一个模型时,代码必须知道Record需要什么类型。如果这发生在应该是通用的部分中,那么我必须添加另一个模板参数。
过了一段时间,我发现开始有很多使用模板参数的方法。只是这样可以将类型传递给Model<RecordGuid>,有时我必须将模板参数传递到几个方法调用的链中,然后才能到达真正需要它的代码。
有没有比我正在做的更有效的模式?
编辑:
Model使用模板参数的一个原因是它需要具有返回Record. 在 C# 中,您不能强制List<Record>转换为,List<RecordGuid>因此我不得不使用模板参数作为返回类型作为List<T>.