9

我的一个项目有一个值类型/结构,它表示视频格式的自定义标识符字符串。在这种情况下,它将包含一个内容类型字符串,但这可能会有所不同。

我使用了一个结构,因此它在传递时可以是强类型,并对初始字符串值执行一些完整性检查。实际的字符串值可以是任何东西,并且由外部插件库提供,因此enum不适用数字。

public struct VideoFormat {
    private string contentType;

    public VideoFormat(string contentType) {
        this.contentType = contentType;
    }

    public string ContentType {
        get { return this.contentType; }
    }

    public override string ToString() {
        return this.contentType;
    }

    // various static methods for implicit conversion to/from strings, and comparisons
}

由于有一些非常常见的格式,我将它们公开为具有默认值的静态只读字段。

public static readonly VideoFormat Unknown = new VideoFormat(string.Empty);
public static readonly VideoFormat JPEG = new VideoFormat("image/jpeg");
public static readonly VideoFormat H264 = new VideoFormat("video/h264");

这似乎在大多数情况下都有效,除了一个开关块,它说值必须是一个常数。有什么方法可以直接在 switch 块中使用这种类型和静态值,而无需打开内部成员或.ToString()覆盖?

有没有更好的整体方法来做到这一点,而不使用enum用数值或纯字符串常量指定的设计时间?

4

3 回答 3

13

更新:由于 C# 7 中 switch 语句的新规则,此答案不再完全准确。有关详细信息,请参阅 C# 7 文档。


有什么办法可以直接在 switch 块中使用这种类型和静态值

否。 switch 语句的控制类型必须是 sbyte、byte、short、ushort、int、uint、long、ulong、char、bool、任何枚举、任何这些的可空值类型或字符串之一。并且 case 标签中使用的常量必须是与控制类型兼容的编译时常量。

于 2013-03-19T00:09:59.733 回答
3

实际上,重构代码可能会更好,这样您根本就不必使用switch语句。虽然构造本身不是反模式,但使用多态性代替是普遍接受的做法。是另一个关于摆脱.switch

于 2013-03-18T23:08:46.790 回答
1

在我看来,您正在使用的所有可能的视频格式都可能是使用枚举的经典示例。当添加一些其他格式时,我真的认为用新值扩展您的枚举没有问题。是的,重要的是我们需要确保VideoFormat程序中使用的任何内容都适合枚举。但可能不会是劣势。

于 2013-03-18T23:45:17.403 回答