[英]How to control Type conversion in C#
有沒有辦法控制C#中的類型轉換? 例如,如果我有兩種類型具有基本相同的細節,但一種用於我的應用程序的內部工作,另一種是用於與非.Net應用程序通信的DTO:
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; }
}
現在,我需要每次從我的Player實例創建一個新的PlayerDTO實例,我正在尋找一種更好,更清晰的方法。 我的一個想法是向播放器類添加一個AsPlayerDTO()方法,但如果我可以控制類型轉換過程會很好,所以我可以這樣做:
var playerDto = player as PlayerDTO;
任何人都知道這是否可能以及我怎么能這樣做?
謝謝,
您可以在兩種類型之間實現顯式的convesion運算符 。
您還可以考慮使用AutoMapper完成任務。
您可以實現隱式或顯式類型轉換: http : //msdn.microsoft.com/en-us/library/ms173105.aspx 。
或者,如果您想避免讓每個類必須知道另一個,您可以使用自定義映射或現有的映射庫,如AutoMapper 。
轉換運算符怎么樣:
public static explicit operator PlayerDTO (Player value)...
public static implicit operator PlayerDTO (Player value)...
您可以使用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;
}
}
使用AutoMapper @ http://www.codeplex.com/AutoMapper
聽起來你應該使用一個界面。
然后轉換到界面:示例如下
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是一條更好的路線! 我認為
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.