2010-02-05 19 views
7

Czy istnieje sposób kontrolowania konwersji typu w języku C#? Tak na przykład, jeśli mam dwa typy z zasadniczo takich samych informacji, ale służy do wewnętrznego funkcjonowania mojego wniosku, a drugi jest DTO używany do komunikacji z aplikacjami non-.Net:Jak kontrolować konwersję typu w C#

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; } 
} 

Prawy teraz, za każdym razem muszę utworzyć nową instancję PlayerDTO z mojej instancji Player i szukam lepszego, czystszego sposobu robienia tego. Jednym z pomysłów było to, aby dodać metodę AsPlayerDTO() do klasy graczem, ale byłoby miło, gdyby można kontrolować proces konwersji typu, więc mogę to zrobić w zamian:

var playerDto = player as PlayerDTO; 

Ktoś wie, czy jest to możliwe i jak mógłbym to zrobić?

Dzięki,

Odpowiedz

3

można realizować zarówno bezpośrednia lub pośrednia konwersję typu: http://msdn.microsoft.com/en-us/library/ms173105.aspx.

Jeśli chcesz uniknąć sytuacji, w której każda klasa musi wiedzieć o drugiej, możesz użyć niestandardowego mapowania lub istniejącej biblioteki mapowania, takiej jak AutoMapper.

+0

Przeciążanie niejawnego/jawnego operatora wydaje się działać dla mnie i jest dość czyste. Co ciekawe, nie dotyczy to tablic, ale AutoMapper wydaje się oferować tę opcję na podstawie komentarza Michaela Meadowsa poniżej. Czy istnieje sposób na wdrożenie tego bez korzystania z 3 rozszerzeń, takich jak AutoMapper? – theburningmonk

+0

Nieważne, znalazłem odpowiedź na moje drugie pytanie na innym pytanie stackoverflow http://stackoverflow.com/questions/1865031/why-wont-castdouble-work-on-ienumerableint Array.ConvertAll (playerList.ToArray(), p => (PlayerDTO) p); – theburningmonk

+1

Ponadto, jeśli używasz Linq, możesz użyć Wybierz ... playerArray.Select (player => (PlayerDTO) player) .ToArray(); –

0

Co operatora konwersji:

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

można wdrożyć explicit convesion operator pomiędzy tymi dwoma typami.

Można również rozważyć użycie AutoMapper dla zadania.

+0

+1 dla AutoMapper – mhenrixon

+0

Również +1 dla AutoMapper. "Pierwsze kroki" to niemal dokładnie scenariusz PO. http://automapper.codeplex.com/wikipage?title=Getting%20Started&referringTitle=Documentation Używamy metody rozszerzenia, która pozwala to zrobić: var playerDto = player.MapTo (); –

0

Nadal będziesz musiał wykonać kod, aby utworzyć obiekt DTO, ale możesz przeciążyć operatora rzutowania, aby rzucić go z obiektu implementacji do obiektu DTO. Możesz nawet wykonać niejawną obsadę.

zobaczyć overloading cast i implicit

0

Można użyć explicit typu konwersji.

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

Brzmi jak należy używać interfejsu.

Następnie oddanych do interfejsu: Przykład poniżej

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

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

byłoby wtedy użyć iPlayer jako obiekt DTO. Zakładam, że dzieje się tak dlatego, że klasa Player nie istnieje w innym zespole i nie chcesz jej więcej. Następnie można użyć odtwarzacza IP we współużytkowanym zestawie ... do przenoszenia między złożeniami.

Nadzieja to pomaga ... ;-)

Aktualizacja

#

Auto Mapper jest lepsza droga! Myślę, że

Powiązane problemy