用于修改枚举值的扩展方法

时间:2012-05-19 02:01:06

标签: c# enums extension-methods

我对扩展程序有点新意。在我发布这篇文章之前,我一直在寻找现有答案,因为我讨厌写作,但我没有看到任何有用的内容。

我希望有一个带有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”的变量的传递是非常类似于通过引用传递,但我显然是不正确的。方法里面的价值就像我想的那样,但结果......好吧,我想我已经说过了;因此这个问题。

2 个答案:

答案 0 :(得分:3)

枚举是值类型。他们是不变的。你无法改变它们的价值。

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

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

其中

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

答案 1 :(得分:1)

自C#7.2起

只需添加参考

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