2010-02-05 15 views
7

Gibt es eine Möglichkeit, die Typumwandlung in C# zu steuern? So zum Beispiel, wenn ich mit im Wesentlichen der gleichen Details zwei Typen habe, aber man wird für die interne Arbeits meiner Anwendung verwendet, und der andere ist ein DTO für die Kommunikation mit non-.Net Anwendungen verwendet:So steuern Sie die Typumwandlung in 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; } 
} 

Recht Jetzt muss ich jedes Mal eine neue Instanz von PlayerDTO aus meiner Player-Instanz erstellen und suche nach einer besseren und saubereren Methode. Eine Idee, die ich hatte, war ein AsPlayerDTO() -Methode für den Spieler Klasse hinzufügen, aber wäre schön, wenn ich den Typ Konvertierungsprozess steuern kann, damit ich diese stattdessen tun können:

var playerDto = player as PlayerDTO; 

Wer weiß, ob dies möglich ist und wie könnte ich es schaffen?

Danke,

Antwort

3

Sie entweder Umwandlung implizite oder explizite Typs implementieren können: http://msdn.microsoft.com/en-us/library/ms173105.aspx.

Wenn Sie jedoch vermeiden möchten, dass jede Klasse etwas über die andere wissen muss, können Sie entweder ein benutzerdefiniertes Mapping oder eine vorhandene Mapping-Bibliothek wie AutoMapper verwenden.

+0

Überladen der impliziten/expliziten Operator scheint für mich zu arbeiten und es ist auch einigermaßen sauber. Seltsamerweise gilt dies nicht für Arrays, aber AutoMapper scheint diese Option basierend auf dem Kommentar von Michael Meadows unten zu geben. Gibt es eine Möglichkeit, dies zu implementieren, ohne 3. Erweiterungen wie AutoMapper zu verwenden? – theburningmonk

+0

Macht nichts, fand die Antwort auf meine zweite Frage auf einer anderen stackoverflow Frage http://stackoverflow.com/questions/1865031/why-wont-castdouble-work-on-ienumerableint Array.ConvertAll (playerList.ToArray(), p => (Spieler DTO) p); – theburningmonk

+1

Wenn Sie Linq verwenden, können Sie auch Select ... playerArray.Select (player => (PlayerDTO) player) verwenden. ToArray(); –

0

Was Konvertierungsoperator:

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

Sie können eine explicit convesion operator zwischen den beiden Typen implementieren.

Sie könnten auch AutoMapper für die Aufgabe verwenden.

+0

+1 für AutoMapper – mhenrixon

+0

Auch +1 für AutoMapper. Das "Getting Started" ist fast genau das OP-Szenario. http://automapper.codeplex.com/wikipage?title=Getting%20Started&referringTitle=Documentation Wir verwenden eine Erweiterungsmethode, mit der Sie dies tun können: var playerDto = player.MapTo (); –

0

Sie müssen weiterhin den Code zum Erstellen des DTO-Objekts erstellen, aber Sie können den Umwandlungsoperator überladen, um von Ihrem Implementierungsobjekt auf das DTO-Objekt zu konvertieren. Sie können sogar eine implizite Besetzung machen.

siehe overloading cast und implicit

0

Sie explicit Typkonvertierungen verwenden können.

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

Klingt wie Sie eine Schnittstelle verwenden sollten.

werfen dann an die Schnittstelle: Beispiel unten

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

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

würden Sie dann den iPlayer Als Objekt DTO verwenden. Ich nehme an, das liegt daran, dass die Player-Klasse in der anderen Assembly nicht existiert und Sie nicht mehr wollen. Sie könnten dann den IPlayer in einer freigegebenen Assembly verwenden, um zwischen Assemblys zu wechseln.

Hope this ... ;-)

aktualisieren

#

das Auto Mapper ist eine bessere Route hilft! Ich denke

Verwandte Themen