簡體   English   中英

如何將一個對象轉換為另一個對象?

[英]How do I convert one object to another?

我有一個名為IDeviceId的接口,我在我的域中使用。 我還有幾個實現IDeviceId的具體類。 每個具體類都包含特定類型DeviceId的邏輯。 例如,我有DeviceMacId ,它只是一個有效的MAC地址。 另一個具體的類是DeviceShortMacId ,它獲取有效MAC地址的最后6位數字,並將其與固定的6個字符前綴組合以創建有效的MAC(幾個遺留應用程序僅使用最后6位數字)。 我有一些用於表達ID的其他類,但其中大多數都是相同數據的衍生物。

我希望能夠輕松地從這些類中的任何一個轉換為另一個類。 我的第一個想法是創建一個靜態類並執行類似DeviceIdConverter.ToDeviceShortMacId(IDeviceId)的操作

什么是能夠輕松接受一種形式的數據,然后以可重復的方式(跨多個應用程序)將其轉換為另一種形式的最佳方式?

一種可能性是實現自己的鑄造:

public static explicit operator DeviceShortMacId(DeviceMacId deviceMacID)
{
    return new DeviceShortMacId(deviceMacID.MacAddress);
}

public static explicit operator DeviceMacId(DeviceShortMacId deviceShortMacID)
{
    return new DeviceMacId(deviceShortMacID.MacAddress);
}

這樣你就可以做到:

DeviceMacId newDeviceId = (DeviceShortMacId)deviceMacID

使用這種方法,如果無法進行某些轉換,您可以自己處理並拋出InvalidCastException

我不認為有一個“最好的方法”來做到這一點,你將不得不找到一個適合你的模式並繼續使用它。

根據您提供的示例,我會做的事情如下:

interface IDeviceId
{
    // Other methods
    IDeviceId ToDeviceShortMacId(IDeviceId);
    IDeviceId ToDeviceMacId(IDeviceId);
    // etc...
}

然后每個類都需要實現轉換方法。 現在,如果您計划稍后添加許多其他實現(具體)類,那么這可能會非常冗長。 那么在這種情況下您可能會考慮的是在每個創建新實現的項目中,您還可以創建擴展方法,如:

public static class MacDeviceIdExtensions
{
public static DeviceMacId ToDeviceMacId(this IDeviceId deviceId) 
{
    // Implement conversion
}
public static DeviceShortMacId ToDeviceMacId(this IDeviceId deviceId) 
{
    // Implement conversion
}
}

擴展方法方法更加模塊化,但也可以使用更多代碼。

為什么不在所有接受IDeviceID對象的IDeviceID實現類上創建構造函數。

DeviceMacID macID = new DeviceMacID(...whatever you do normally...);
DeviceShortMacID shortMacID = new DeviceShortMacID((IDeviceID)macID);

示例代碼

public DeviceShortMacID : IDeviceID
{
    private ID _ID;
    public DeviceShortMacID() { }
    public DeviceShortMacID(IDeviceID id)
    {
        if (id is DeviceshortMacID)
            this._ID = id.GetID();
       else 
            this._ID = this.ConvertFrom(id);
    }

    public ID ConvertFrom(IDeviceID oldID) { ... convert code ...}
    public ID GetID() { return this_ID; }
}

public interface IDeviceID
{
    public ID GetID();
    public ID ConvertFrom(IDeviceID oldID);
}

public class ID { } // I don't know what you return so I'm making up this class

叫我老式,但我有點像靜態方法。 您將具有與實體分離的轉換邏輯,並使用描述性方法名稱來描述每個轉換的作用。 您可能還想考慮將它們實現為擴展方法。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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