设计要更改枚举的模式
本文关键字:枚举 模式 | 更新日期: 2023-09-27 18:20:06
我在使用枚举时遇到问题。假设我已经定义了枚举,它命名了DeviceType,外部客户端使用它来指定他们想从我的设备容器中使用的设备。但由于enum是不可扩展的,如果不更新我的库并让所有用户更新到新版本,我就无法拥有新设备。我正在为这个问题寻找尽可能简单的解决方案。我不想使用属性或任何其他.NET"作弊"功能。
public class Program
{
private static List<IDevice> devices;
public static void Main(String[] args)
{
devices = new List<IDevice>()
{
new NetworkDevice()
};
IEnumerable<IDevice> currentDevices = GetDevices(DeviceType.Network);
IEnumerable<IDevice> newDevices = GetDevices(DeviceType.NewNetwork); // Will not work, unless client updates my library to get newly added enum types
}
private static IEnumerable<IDevice> GetDevices(DeviceType type)
{
return devices.Where(device => device.Type == type);
}
}
public enum DeviceType
{
Network
}
public interface IDevice
{
DeviceType Type { get; }
}
public class NetworkDevice : IDevice
{
public DeviceType Type
{
get
{
return DeviceType.Network;
}
}
}
使用枚举来表示类型通常意味着您应该创建类层次结构。
类似地,表示类型的枚举上的switching
通常意味着有一个或多个虚拟方法希望引入该层次结构中。
打算如何使用枚举类型?有没有一种方法可以将其用法表示为对虚拟方法的调用?
(你问题中的代码显示了正在筛选的特定类型的设备,但它没有显示找到这些项目后你对它们调用的方法。)
[EDIT]作为一种替代方案,您可以使用Managed Extensibility Framework
进行全核测试。不过,这违反了你的"禁止作弊"规定…;)
您的最佳选择是给我们一个List<string>
,并从某个后端数据存储填充它。通过此操作,您可以使用要用于相关List<string>
的有效值更新数据存储。
public enum DeviceType
{
Network
}
将不再需要存在,并且您将更新IDevice以仅使用字符串
public interface IDevice
{
string Type { get; }
}
@马修的观点很好。但是,如果您主要关心的是能够在不重新编译代码的情况下更改值,则需要类似于上面的内容。