如何将一个对象转换为另一个对象

本文关键字:一个对象 转换 | 更新日期: 2023-09-27 18:18:28

我有一个名为IDeviceId的接口,我在我的域中使用它。我还有几个实现IDeviceId的具体类。每个具体类都包含特定类型DeviceId的逻辑。例如,我有DeviceMacId,它只是一个有效的MAC地址。另一个具体的类是 deviceshortacid ,它接受有效MAC地址的最后6位数字,并将其与固定的6个字符前缀组合以创建一个有效的MAC(一些遗留应用程序只使用最后6位数字)。我有一些其他的类来表示ID,但它们中的大多数都是相同数据的衍生物。

我希望能够轻松地从这些类中的任何一个转换到另一个。我的第一个想法是创建一个静态类,并做一些像 deviceidconverter . todeviceshortacid (IDeviceId).

能够轻松地接受一种形式的数据,然后以可重复的方式(跨多个应用程序)将其转换为另一种形式的最佳方法是什么?

如何将一个对象转换为另一个对象

我不认为有一个"最好的方法"来做这件事,你必须找到一个适合你的模式,并按照它去做。

根据你举的例子,我想我应该这样做:

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
}
}

扩展方法的方法更加模块化,但也可能是更多的代码。

一种可能是实现您自己的类型转换:

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 .

你可以说我是老式的,但我有点喜欢这里的静态方法方法。转换逻辑将与实体解耦,并使用描述性方法名来描述每个转换的操作。您可能还想考虑将它们实现为扩展方法。

为什么不直接在所有接受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