可与switch()一起使用的自定义结构/类型

时间:2013-03-18 23:00:31

标签: c# switch-statement value-type object-model

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

我使用了一个结构体,因此当它传递时它可以是强类型,并对初始字符串值执行一些健全性检查。 实际的字符串值可以是任何内容,由外部插件库提供,因此数字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");

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

如果没有使用指定enum的数字值或普通字符串常量的设计时间,是否有更好的整体方法?

3 个答案:

答案 0 :(得分:11)

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


  

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

没有。 switch语句的管理类型必须是sbyte,byte,short,ushort,int,uint,long,ulong,char,bool,any enum,其中任何一个的可空值类型,或字符串。案例标签中使用的常量必须是与管理类型兼容的编译时常量。

答案 1 :(得分:3)

实际上,重构代码可能会更好,这样您就不必在所有中使用switch语句。虽然构造本身不是反模式,但通常使用polymorphism来接受。 Here是另一种关于摆脱switch的方法的讨论。

答案 2 :(得分:1)

在我看来,您正在使用的所有可能的视频格式都可以成为使用枚举的典型示例。在添加其他格式时,我真的没有看到使用新值扩展枚举的问题。是的,我们需要确保程序中使用的VideoFormat符合枚举的重要性。但可能它不会是一个缺点。