Как управлять Преобразованием типов в C#

Существует ли способ управлять преобразованием типов в C#? Так, например, если у меня есть два типа с по существу теми же деталями, но каждый используется для внутренней работы моего приложения, и другой DTO, используемый для общения с приложениями не.NET:

public sealed class Player
{
  public Player(string name, long score)
  {
    Name = name;
    Score = score;
    ID = Guid.NewGuid();
  }

  public string Name { get; private set; }

  public Guid ID { get; private set; }

  public long Score { get; private set; }
}

public sealed class PlayerDTO
{
  public PlayerDTO(string name, long score, string id)
  {
    Name = name;
    Score = score;
    ID = id;
  }

  public string Name { get; private set; }

  // the client is not .Net and doesn't have Guid
  public string ID { get; private set; }  

  public long Score { get; private set; }
}

Прямо сейчас я должен создать новый экземпляр PlayerDTO от моего экземпляра Плеера каждый раз, когда и я ищу лучший, более чистый способ сделать это. Одна идея, которую я имел, состояла в том, чтобы добавить AsPlayerDTO () метод к классу плеера, но будет хороша, если я могу управлять процессом преобразования типов, таким образом, я могу сделать это вместо этого:

var playerDto = player as PlayerDTO; 

Кто-либо знает, возможно ли это и как я смог делать это?

Спасибо,

7
задан theburningmonk 5 February 2010 в 15:47
поделиться

6 ответов

Вы можете реализовать неявное или явное преобразование типов: http://msdn.microsoft.com/en-us/library/ms173105.aspx .

В качестве альтернативы, если вы не хотите, чтобы каждый класс знал о другом, вы можете использовать либо настраиваемое сопоставление, либо существующую библиотеку сопоставления, например AutoMapper .

3
ответ дан 7 December 2019 в 05:22
поделиться

Вы можете реализовать явный оператор преобразования между двумя типами.

Вы также можете рассмотреть возможность использования AutoMapper для этой задачи.

5
ответ дан 7 December 2019 в 05:22
поделиться

Вам все равно придется написать код для создания объекта DTO, но вы можете перегрузить оператор приведения, чтобы привести его из объекта реализации к объекту DTO. . Вы даже можете сделать неявное приведение.

см. приведение перегрузки и неявное

0
ответ дан 7 December 2019 в 05:22
поделиться

Можно использовать явное преобразование типов.

public sealed class Player {
  public static explicit operator PlayerDTO(Player p) {
    PlayerDTO dto;
    // construct
    return dto;
  }
}

public sealed class PlayerDTO {
  public static explicit operator Player(PlayerDTO dto) {
    Player p;
    // construct
    return p;
  }
}
0
ответ дан 7 December 2019 в 05:22
поделиться

А как насчет оператора преобразования:

public static explicit operator PlayerDTO (Player value)...
public static implicit operator PlayerDTO (Player value)...
0
ответ дан 7 December 2019 в 05:22
поделиться

Используйте AutoMapper @ http://www.codeplex.com/AutoMapper

0
ответ дан 7 December 2019 в 05:22
поделиться
Другие вопросы по тегам:

Похожие вопросы: