自定义结构/可与开关一起使用的类型()(Custom structure/type that can

2019-08-17 17:24发布

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

我用一个结构,因此它可以当它是通过周围被强类型,并在初始字符串值执行一些完整性检查。 实际的字符串值可以是任何东西,并通过外部插件库提供这样一个数字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与数值或普通字符串常量?

Answer 1:

更新:这个答案是不再完全准确的,由于在C#7 switch语句的新规则详见C#7文档。


有没有什么办法,我可以利用这个类型的,并在开关模块直接静态值

号switch语句的主导类型必须为sbyte,字节,短,USHORT,INT,UINT,长,ULONG,炭,布尔,任何enum之一,空值类型的任何那些,或字符串。 而在case标签使用的必须是常量编译主导类型兼容的时间常数。



Answer 2:

实际上,它可能会更好重构代码,这样你就不必使用switch 的所有语句。 虽然建筑本身是不是一个反模式,但普遍接受的做法是使用多态来代替。 这里是的方式另议摆脱switch



Answer 3:

在我看来,所有你正在使用的可能videoformats可能是使用枚举一个典型的例子。 我实在看不出与新的价值扩展您的枚举当一些其他格式将被添加的一个问题。 是的,我们需要的最重要的事情是确保任何VideoFormat在程序中使用应符合枚举。 但可能不会是一个缺点。



文章来源: Custom structure/type that can be used with switch()