2010-02-05 7 views
7

¿Hay alguna manera de controlar la conversión de tipo en C#? Así, por ejemplo, si tengo dos tipos esencialmente con los mismos detalles, pero una se utiliza para el funcionamiento interno de mi solicitud y el otro es un DTO utilizado para comunicarse con aplicaciones non-.Net:Cómo controlar la conversión de tipo en 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; } 
} 

Derecho ahora, necesito crear una nueva instancia de PlayerDTO desde mi instancia de Player en todo momento y estoy buscando una forma mejor y más limpia de hacerlo. Una idea que tuve fue la de añadir un método AsPlayerDTO() a la clase de jugador, pero sería bueno si puedo controlar el proceso de conversión de tipo de modo que pueda hacer esto en su lugar:

var playerDto = player as PlayerDTO; 

Alguien sabe si esto es posible y cómo podría ser capaz de hacerlo?

Gracias,

Respuesta

3

Puede implementar ya sea implícita o explícita de conversión de tipo: http://msdn.microsoft.com/en-us/library/ms173105.aspx.

Alternativamente, si desea evitar que cada clase tenga que saber acerca de la otra, puede usar la asignación personalizada o una biblioteca de asignación existente como AutoMapper.

+0

Sobrecargar el operador implícito/explícito parece funcionar para mí y también es razonablemente limpio. Sin embargo, curioso, esto no se aplica a las matrices, pero AutoMapper parece dar esa opción en función del comentario de Michael Meadows a continuación. ¿Hay alguna manera de implementar esto sin usar 3ras extensiones como AutoMapper? – theburningmonk

+0

No importa, encontré la respuesta a mi segunda pregunta sobre otra pregunta de stackoverflow http://stackoverflow.com/questions/1865031/why-wont-castdouble-work-on-ienumerableint Array.ConvertAll (playerList.ToArray(), p => (PlayerDTO) p); – theburningmonk

+1

Además, si está utilizando Linq, puede usar Seleccionar ... playerArray.Select (player => (PlayerDTO) player) .ToArray(); –

0

¿Qué hay de operador de conversión:

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

Puede implementar un explicit convesion operator entre los dos tipos.

También podría considerar usar AutoMapper para la tarea.

+0

+1 por AutoMapper – mhenrixon

+0

También +1 por AutoMapper. El "Primeros pasos" es casi exactamente el escenario del PO. http://automapper.codeplex.com/wikipage?title=Getting%20Started&referringTitle=Documentation Utilizamos un método de extensión que le permite hacer esto: var playerDto = player.MapTo (); –

0

Igual tendrá que hacer el código para crear el objeto DTO, pero puede sobrecargar al operador de conversión para enviar desde su objeto de implementación al objeto DTO. Incluso puedes hacer un lanzamiento implícito.

ver overloading cast y implicit

0

Puede utilizar explicit conversiones de tipos.

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

Suena como que usted debe utilizar una interfaz.

A continuación, convertir a la interfaz: Ejemplo a continuación

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

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

A continuación, utilizar el iPlayer Como el objeto DTO. Supongo que esto se debe a que la clase Player no existe en el otro ensamblado y no desea más. A continuación, puede usar IPlayer en un ensamblado compartido ... para transferir entre ensamblajes.

Espero que esto ayude ... ;-)

actualización

#

el Mapper Auto es una ruta mejor! Creo que

Cuestiones relacionadas