【问题标题】:Extension Method to modify an enum value [duplicate]修改枚举值的扩展方法[重复]
【发布时间】:2012-05-19 02:01:05
【问题描述】:

我对扩展有点陌生。因为我不想写,所以在发布之前我四处寻找现有的答案,但我没有看到任何我认为有帮助的东西。

我想要一个带有 Flag 属性的枚举的扩展方法,我可以调用它基本上将另一个枚举/标志附加到调用枚举。

在有人将其否决为 Int32.MinValue 之前,我确实看起来相当数量,但我发现的只是一堆关于“IsFlagSo-and-SoSet”和标志处理的问题,但不是简单地添加一个标志。

我将枚举定义如下:

    [Flags]
    internal enum eDiskFormat
    {
        None        = 0x00,

        _3D         = 0x01,

        Blu_ray_3D  = 0x02,

        Blu_ray     = 0x04,

        DigitalCopy = 0x08,

        Dvd         = 0x10

    }

扩展名被定义为:

    internal static void AddFormat(this Movie.eDiskFormat target, Movie.eDiskFormat newFormat)
    {
        target |= newFormat;
    }

当我如下调用它时,我希望生成的枚举是 Movie.eDiskFormat.Blu_ray...(它被初始化为 eDiskFormat.None)。

m.DiskFormat.AddFormat(Movie.eDiskFormat.Blu_ray);

相反,结果值仍然是 eDiskFormat.None。我以为用“this”传递变量是非常类似于通过引用传递,但我显然是不正确的。方法内部的值和我想的一样,但是结果……好吧,我想我已经说过了;所以这个问题。

【问题讨论】:

标签: c# enums extension-methods


【解决方案1】:

枚举是值类型。它们是不可变的。您无法更改它们的值。

你能做的最好的事情是这样的:

m.DiskFormat = m.DiskFormat.AddFormat(Movie.eDiskFormat.Blu_ray); 

在哪里

internal static Movie.eDiskFormat AddFormat(this Movie.eDiskFormat target, 
                                                 Movie.eDiskFormat newFormat)   
{   
    return target | newFormat;   
}   

【讨论】:

  • True - 我要补充一点,最好有一个 Disk 类,其方法包含 DiskFormat 的标志枚举。磁盘可能有其他有用的方法(如长度等)
  • 啊.. 好吧,设计只是简单地跟踪它是什么类型的 DVD 光盘,DVD、Bul-ray、Blu-ray 3D、数字副本等。它不是将被添加到除此之外。我没有修改任何东西,所以静态类型枚举运行良好。不过,谢谢。
【解决方案2】:

自 C# 7.2 起

只需添加参考

internal static void AddFormat(ref this Movie.eDiskFormat target, Movie.eDiskFormat newFormat)
{
    target |= newFormat;
}

【讨论】:

    猜你喜欢
    • 2010-09-21
    • 2023-03-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-13
    • 2010-12-10
    相关资源
    最近更新 更多