我在我的域中使用了名为 IDeviceId 的界面。我还有几个实现 IDeviceId 的具体类。每个具体类都包含特定类型的 DeviceId 的逻辑。例如,我有 DeviceMacId ,这只是一个有效的MAC地址。另一个具体的类是 DeviceShortMacId ,它获取有效MAC地址的最后6位数字,并将其与固定的6个字符前缀组合以创建有效的MAC(几个旧版应用程序仅使用最后6位数字) 。我还有一些用于表达ID的其他类,但其中大多数都是相同数据的衍生物。
我希望能够轻松地从这些类中的任何一个转换为另一个类。我的第一个想法是创建一个静态类,并执行类似 DeviceIdConverter.ToDeviceShortMacId(IDeviceId)的操作。
哪种方式能够轻松接受一种形式的数据,然后以可重复的方式(跨多个应用)将其转换为另一种形式?
答案 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)
叫我老式,但我有点像静态方法。您将具有与实体分离的转换逻辑,并使用描述性方法名称来描述每个转换的作用。您可能还想考虑将它们实现为扩展方法。