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

时间:2011-12-21 20:02:51

标签: c# .net

我在我的域中使用了名为 IDeviceId 的界面。我还有几个实现 IDeviceId 的具体类。每个具体类都包含特定类型的 DeviceId 的逻辑。例如,我有 DeviceMacId ,这只是一个有效的MAC地址。另一个具体的类是 DeviceShortMacId ,它获取有效MAC地址的最后6位数字,并将其与固定的6个字符前缀组合以创建有效的MAC(几个旧版应用程序仅使用最后6位数字) 。我还有一些用于表达ID的其他类,但其中大多数都是相同数据的衍生物。

我希望能够轻松地从这些类中的任何一个转换为另一个类。我的第一个想法是创建一个静态类,并执行类似 DeviceIdConverter.ToDeviceShortMacId(IDeviceId)的操作。

哪种方式能够轻松接受一种形式的数据,然后以可重复的方式(跨多个应用)将其转换为另一种形式?

4 个答案:

答案 0 :(得分:3)

一种可能性是实现自己的演员:

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

答案 1 :(得分:3)

我认为没有一种“最好的方法”可以做到这一点,你将不得不找到一种适合你的模式并随之而去。

根据您提供的示例,我会做出类似的事情:

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

扩展方法方法更加模块化,但也可以提供更多代码。

答案 2 :(得分:2)

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

答案 3 :(得分:2)

叫我老式,但我有点像静态方法。您将具有与实体分离的转换逻辑,并使用描述性方法名称来描述每个转换的作用。您可能还想考虑将它们实现为扩展方法。