设计要更改枚举的模式

本文关键字:枚举 模式 | 更新日期: 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; }
}

@马修的观点很好。但是,如果您主要关心的是能够在不重新编译代码的情况下更改值,则需要类似于上面的内容。