班级之间是否有转换的模式

时间:2019-10-28 19:29:09

标签: c# design-patterns

我有一个来自本地库的类,我想转换为自己的类型,并且需要在几个地方进行。然后,我创建了一个静态方法,因此不需要在很多地方重复该类的实例化,但是在某种程度上,它似乎并不正确。

如果需要创建8种不同类型的转换,那么Record中将有8种不同的转换方法。

这是最好的方法吗?或者是否有涵盖该主题的已知模式?

class Record
{
  public String Id { get; set; }
  public String FirstName { get; set; }
  public String LastName { get; set; }
  public String FingerPrints { get; set; }

  //
  // This is a simplification of the method and in fact, I created several of
  // them, and the class doesn't look clean anymore.
  //
  public static Record CreateFromMaciRecord(MaciRecord maci)
  {
    return new Record
      {
        Id = maci.GetRecordId(),
        FirstName = Encoding.UTF8.GetString(maci.GetUserDataField("first_name")),
        LastName = Encoding.UTF8.GetString(maci.GetUserDataField("name"))
      };
  }
}

3 个答案:

答案 0 :(得分:2)

如果您不需要构造函数或静态工厂方法,则可以引入扩展方法。 EG

static class Conversions
{
    public static Record ToRecord(this MaciRecord maci) => new Record
    {
        Id = maci.GetRecordId(),
        FirstName = Encoding.UTF8.GetString(maci.GetUserDataField("first_name")),
        LastName = Encoding.UTF8.GetString(maci.GetUserDataField("name"))
    };
}

您会打电话给

  var maciRecord = ...;
  var record = maciRecord.ToRecord();

答案 1 :(得分:1)

您始终可以在Record中提供隐式转换,只需执行以下操作即可:

Record record = someMaciRecord;

将此添加到Record

public static implicit operator Record(MaciRecord maci) 
{
     return new Record
     {
         Id = maci.GetRecordId(),
         FirstName = Encoding.UTF8.GetString(maci.GetUserDataField("first_name")),
         LastName = Encoding.UTF8.GetString(maci.GetUserDataField("name"))
     };
}

答案 2 :(得分:1)

如果您的 Record 正在转换 MaciRecord 的接口以便与其余应用程序一起使用,那么我建议使用 Class或Object Adapter GOF设计模式< / em>。如果 Record 正在向 MaciRecord 添加新功能,则为 Decorator GOF设计模式提供机会。我们有必要通过 MaciRecord 请求包装器。这里要注意的是,这两种设计模式也称为<包装器>。