Есть ли шаблон для преобразования между классами - PullRequest
0 голосов
/ 28 октября 2019

У меня есть класс из нативной библиотеки, я хочу преобразовать его в свой собственный тип, и мне нужно сделать это в нескольких местах. Затем я создал статический метод, поэтому мне не нужно повторять создание экземпляра класса во многих местах, но почему-то это кажется неправильным.

Если необходимо создатьпреобразование из 8 различных типов, у меня было бы 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 ]

2 голосов
/ 28 октября 2019

Если вам не нужен конструктор или статический метод фабрики, вы можете ввести методы расширения. 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 голос
/ 29 октября 2019

Если ваша Запись преобразует интерфейс MaciRecord , чтобы работать с остальной частью приложения, тогда я бы порекомендовал Шаблон проектирования GOF адаптера класса или объекта ,Если Record добавляет новую функциональность к MaciRecord , тогда появляется возможность Шаблон проектирования GOF Decorator . Обязательно мы просим Wrapper над MaciRecord . Здесь следует отметить, что оба эти шаблона проектирования также известны как Wrapper .

1 голос
/ 28 октября 2019

Вы всегда можете предоставить неявное преобразование в 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"))
     };
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...