Я часто вижу (во многих насмешливых библиотеках, например) методы, где вместо аргумента типа 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()
).
Вот некоторые практические проблемы с использованием этого шаблона, о котором я могу думать:
- Если добавлен аргумент типа non System.Type - метод, возможно, потребуется переписать (если порядок аргументов семантически значим) для не общей версии (в противном случае некоторые аргументы будут аргументами общего типа, а некоторые будут регулярными аргументами).
- для этого требуются два метода (общий и не общий для случаев, когда тип неизвестен во время компиляции). Следовательно, добавляет модульные тесты, которые в основном бессмысленны.
С другой стороны, это обычная практика (и большинство всегда правы, верно?), но, что более важно, ReSharper предпочитает эту подпись, когда я делаю рефакторинг Extract Method на коде, который требует одного аргумента типа System.Type, известного при компиляции (и я научился брать их рекомендации, хотя не по вере, но серьезно).