【问题标题】:Why isn't the RotateFlipType enumeration implemented differently?为什么 RotateFlipType 枚举没有以不同的方式实现?
【发布时间】:2015-09-27 16:13:22
【问题描述】:

这是来自 .NET 4 的 RotateFlipType 枚举的声明:

public enum RotateFlipType
{
    Rotate180FlipXY = 0,
    RotateNoneFlipNone = 0,
    Rotate270FlipXY = 1,
    Rotate90FlipNone = 1,
    Rotate180FlipNone = 2,
    RotateNoneFlipXY = 2,
    Rotate270FlipNone = 3,
    Rotate90FlipXY = 3,
    Rotate180FlipY = 4,
    RotateNoneFlipX = 4,
    Rotate90FlipX = 5,
    Rotate270FlipY = 5,
    RotateNoneFlipY = 6,
    Rotate180FlipX = 6,
    Rotate90FlipY = 7,
    Rotate270FlipX = 7,
}

我了解这些值是如何配对在一起的,否则会产生相同的结果。当将调试器值与RotateFlipType.ToString 值进行比较时,上述枚举变得不友好。也不适合数据绑定场景。例如:

var value = RotateFlipType.RotateNoneFlipNone; // Debugger shows correct string for [value] which is [RotateNoneFlipNone].
var text = value.ToString(); // Output of [text] is [Rotate180FlipXY]. Presumably because it is declared first in the list.

这与操作的顺序有关吗?难道他们没有使用[Flags] 或者将枚举分成两部分(分离旋转和翻转)?

【问题讨论】:

    标签: c# .net winforms enums


    【解决方案1】:

    我知道马早就走了,没必要关上谷仓的门,但是……

    在此模式中选择这些常数是为了使图像反射更容易。

    要水平翻转,可以使用这个简单的操作:

    rotation_value ^= 4;
    

    垂直翻转:

    rotation_value ^= 6;
    

    同时翻转两者(旋转 180 度):

    rotation_value ^= 2;
    

    【讨论】:

    • 谢谢。这是对实际问题的更接近的答案。
    【解决方案2】:

    枚举覆盖ToString 方法以使用Enum.GetName 来查找给定值的名称。而对于GetName,MSDN 有如下备注:

    如果多个枚举成员具有相同的基础值,则 GetName 方法保证它将返回其中一个的名称 枚举成员。但是,它不保证它会 总是返回同一个枚举成员的名字。因此, 当多个枚举成员具有相同的值时,您的 应用程序代码不应该依赖于返回的方法 特定成员的姓名。

    因此,如果多个成员具有相同的值,则无法保证 ToString 会为您提供原始名称。

    【讨论】:

    • 谢谢。为了让绑定更简单,我最终使用了两个单独的枚举进行旋转和翻转以及复合类型来处理冗余组合。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-12
    • 2017-12-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多