簡體   English   中英

如何在C#中控制類型轉換

[英]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)...

您仍然需要執行代碼來創建DTO對象,但是您可以重載強制轉換操作符以從實現對象強制轉換為DTO對象。 你甚至可以進行隱式演員表演。

看看重載強制轉換隱式

您可以使用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;
  }
}

聽起來你應該使用一個界面。

然后轉換到界面:示例如下

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM