4

私は拡張機能に少し慣れていません。私は書くのが嫌いなので、これを投稿する前に既存の回答を探しましたが、役立つと思うものは何も見当たりませんでした.

基本的に呼び出し元の列挙型に別の列挙型/フラグを追加するために呼び出すことができる 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」による変数の受け渡しは、参照渡しと非常に似ていると思っていましたが、明らかに間違っています。メソッド内の値は思った通りなのですが、結果は…まあ、もう言ったかな。したがって、この質問。

4

2 に答える 2

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;   
}   
于 2012-05-19T02:04:57.583 に答える
2

C# 7.2 以降

refを追加するだけ

internal static void AddFormat(ref this Movie.eDiskFormat target, Movie.eDiskFormat newFormat)
{
    target |= newFormat;
}
于 2020-08-27T23:16:26.337 に答える