ホームページ >バックエンド開発 >C++ >C# での Enum 汎用制約の欠如を回避するにはどうすればよいですか?

C# での Enum 汎用制約の欠如を回避するにはどうすればよいですか?

Susan Sarandon
Susan Sarandonオリジナル
2025-01-19 06:02:08611ブラウズ

How Can I Work Around the Lack of Enum Generic Constraints in C#?

C# で列挙型のジェネリック制約が欠落している問題を解決する

C# には列挙型の汎用制約がないため、列挙型の拡張メソッドを作成するときに制限が生じます。ただし、いくつかの回避策があります。

推奨されるアプローチは、UnconstrainedMelody ライブラリを使用することです。このライブラリでは、where T : struct, IEnumConstraint などの「疑似」制約を指定できます。これは、UnconstrainedMelody がビルド後のプロセス中に where T : struct, System.Enum に変換します。

もう 1 つの回避策は、必要な機能を手動で実装することです。たとえば、次の IsSet メソッドを考えてみましょう:

<code class="language-csharp">public static bool IsSet<T>(this T input, T matchTo)
    where T : struct // 不是枚举约束
{
    return (input & matchTo) != 0;
}</code>

このメソッドが複数のフラグを指定して呼び出された場合、単一のフラグの存在のみがチェックされるため、望ましい動作が提供されない可能性があります。

この問題を解決するには、追加のメソッドを定義できます:

<code class="language-csharp">public static bool HasFlags<T>(this T input, params T[] matchTo)
    where T : struct // 不是枚举约束
{
    foreach (var flag in matchTo)
    {
        if ((input & flag) == 0)
            return false;
    }

    return true;
}</code>

このメソッドは、指定されたフラグを反復処理し、すべてのフラグが設定されている場合にのみ true を返します。

命名規則

これらのメソッドの適切な命名規則は好みによって異なります。可能なオプションは次のとおりです:

  • 含まれるもの
  • が含まれます
  • HasFlag (または HasFlags)
  • IsSet

最終的な決定は、メソッドの特定のコンテキストと使用法によって異なる場合があります。

以上がC# での Enum 汎用制約の欠如を回避するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。