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 を返します。
命名規則
これらのメソッドの適切な命名規則は好みによって異なります。可能なオプションは次のとおりです:
最終的な決定は、メソッドの特定のコンテキストと使用法によって異なる場合があります。
以上がC# での Enum 汎用制約の欠如を回避するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。