0

我在使用枚举时遇到问题。假设我已经定义了枚举,它命名了 DeviceType,外部客户端使用它来指定他们想要从我的设备容器中使用的设备。但是由于枚举不可扩展,如果不更新我的库并让所有用户更新到新版本,我就无法拥有新设备。我正在寻找尽可能简单的解决方案来解决这个问题。我不想使用属性或任何其他 .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;
        }
    }
}
4

2 回答 2

2

使用枚举来表示类型通常意味着您应该创建类层次结构。

类似地,switching在表示一种类型的枚举上通常意味着有一个或多个虚拟方法希望被引入到该层次结构的某个地方。

打算如何使用枚举类型?有没有办法将其用法表示为对虚拟方法的调用?

(您问题中的代码显示了正在过滤的特定类型的设备,但它没有显示在找到这些项目后您为这些项目调用的方法。)

[编辑] 作为替代方案,您可以使用它进行全核并使用Managed Extensibility Framework. 那种违反了你的“不作弊”规定虽然......;)

于 2013-06-27T17:06:10.080 回答
0

您最好的选择是List<string>从某个后端数据存储中填充它。有了这个,您可以使用有效值更新数据存储区以用于相关的List<string>.

public enum DeviceType
{
    Network
}

将不再需要存在,并且您将更新 IDevice 以仅使用字符串

public interface IDevice
{
    string Type { get; }
}

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

于 2013-06-27T17:08:58.197 回答