(たとえば、多くのモッキング ライブラリで) type の引数の代わりにジェネリック型引数が使用されるメソッドをよく見かけますSystem.Type
。具体的には、ジェネリック型がtypeof(T)
操作でのみ使用されている場合 (つまり、型 T のインスタンスがメソッド内のどこでも使用されておらず、T が戻り値の型または他の引数のいずれにも使用されていない場合) について話しています。
たとえば、次の方法を検討してください。
public string GetTypeName(System.Type type) { return type.FullName; }
このメソッドには、一般的なバージョンが付随することがよくあります。
public string GetTypeName<T>() { return GetTypeName(typeof(T)); }
質問
それは悪い習慣ですか、それとも良い習慣ですか?
これはシンタックス シュガーですか、それとも他にもありますか?
これは、言語機能を悪用して、型の引数を受け入れるメソッドの呼び出しを省略していると思いますSystem.Type
これを匂いだと思いますか?これは避けるべきですか?または、これは実際には良い習慣です(入力を避けるためのショートカットとしてジェネリックメソッドを提供するためtypeof()
)。
私が考えることができるこのパターンを使用する際のいくつかの実際的な問題を次に示します。
- 非 System.Type 型の引数が追加された場合 - (引数の順序が意味的に重要な場合) メソッドを非ジェネリック バージョンに書き直す必要がある場合があります (そうでない場合、一部の引数はジェネリック型引数になり、一部は通常の引数になります)。
- 2 つのメソッドが必要です (コンパイル時に型がわからない場合は、ジェネリックと非ジェネリック)。その結果、ほとんど意味のない単体テストが追加されます。
一方、これは一般的な方法です (大多数は常に正しいですよね?) が、さらに重要なことに、ReSharper は、コンパイル時に既知の型 System.Type の単一の引数を必要とするコードで Extract Method リファクタリングを行うときに、その署名を好みます (そして私は彼らの勧告を信仰ではなく真剣に受け止めることを学びました)。