Существует ли способ управлять преобразованием типов в 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;
Кто-либо знает, возможно ли это и как я смог делать это?
Спасибо,
Вы можете реализовать неявное или явное преобразование типов: http://msdn.microsoft.com/en-us/library/ms173105.aspx .
В качестве альтернативы, если вы не хотите, чтобы каждый класс знал о другом, вы можете использовать либо настраиваемое сопоставление, либо существующую библиотеку сопоставления, например AutoMapper .
Вы можете реализовать явный оператор преобразования между двумя типами.
Вы также можете рассмотреть возможность использования AutoMapper для этой задачи.
Вам все равно придется написать код для создания объекта DTO, но вы можете перегрузить оператор приведения, чтобы привести его из объекта реализации к объекту DTO. . Вы даже можете сделать неявное приведение.
см. приведение перегрузки и неявное
Можно использовать явное
преобразование типов.
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;
}
}
А как насчет оператора преобразования:
public static explicit operator PlayerDTO (Player value)...
public static implicit operator PlayerDTO (Player value)...
Используйте AutoMapper @ http://www.codeplex.com/AutoMapper