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