Как контролировать преобразование типов в C # - PullRequest
7 голосов
/ 05 февраля 2010

Есть ли способ управления преобразованием типов в 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 из моего экземпляра Player, и я ищу лучший, более чистый способ сделать это. У меня была идея добавить метод AsPlayerDTO () в класс проигрывателя, но было бы неплохо, если бы я мог контролировать процесс преобразования типов, чтобы я мог сделать это вместо этого:

var playerDto = player as PlayerDTO; 

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

Спасибо

Ответы [ 7 ]

5 голосов
/ 05 февраля 2010

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

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

3 голосов
/ 05 февраля 2010

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

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

0 голосов
/ 15 сентября 2015

Похоже, вы должны использовать интерфейс.

Затем приведите к интерфейсу: пример ниже

public interface IPlayer 
{
   string Name { get; set; }
}
public class Player : IPlayer 
{
   string Name { get; set; }
}

IPlayer playerDto = player as IPlayer;
Player player = Player(playerDto);

Затем вы будете использовать IPlayer в качестве объекта DTO. Я предполагаю, что это потому, что класс Player не существует в другой сборке, и вы не хотите больше его. Затем вы можете использовать IPlayer в общей сборке ... для передачи между сборками.

Надеюсь, это поможет ...; -)

Обновление

#

Auto Mapper - лучший маршрут! Я думаю

0 голосов
/ 05 февраля 2010

Использовать AutoMapper @ http://www.codeplex.com/AutoMapper

0 голосов
/ 05 февраля 2010

Вы можете использовать explicit преобразования типов.

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 голосов
/ 05 февраля 2010

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

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

0 голосов
/ 05 февраля 2010

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

public static explicit operator PlayerDTO (Player value)...
public static implicit operator PlayerDTO (Player value)...
...