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

本文关键字:扩展 方法 修改 枚举 用于 | 更新日期: 2023-09-27 18:34:50

我对扩展有点陌生。 在发布之前,我环顾四周寻找现有的答案,因为我讨厌写,但我没有看到任何我觉得有帮助的东西。

我想为具有 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"传递变量与通过引用传递非常相似,但我显然不正确。 方法中的值与我所想的一样,但结果... 好吧,我想我已经说过了;因此这个问题。

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

枚举

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

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

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

哪里

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

自 C# 7.2 起

只需添加参考

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