Я дурачиться с обобщенными методами в последнее время и наткнулся на методы, которые выглядят следующим образом:C# создать экземпляр универсального типа из сигнатуры метода
public static void Requires<TException>(bool condition, string message) where TException : Exception
В моем понимании, при использовании описанной выше методы вы обеспечиваете Type
что наследуется от Exception
, а если condition
- false
, то предоставляется броузер Exception
.
Как это работает под капотом?
Является ли TException
экземпляром так же throw new TException();
?
И как вы можете передать в параметре message
, если Type
неизвестен методу (все, что он знает, это то, что он наследует тип Exception
)?
этот код контракты код? В этом случае 'Requires' означает больше, чем просто проверку состояния и исключение исключения –
@PanagiotisKanavos Я видел его в Code Contracts yes. Меня не интересует то, что он делает, меня больше интересует, как можно взять общий тип, создать новый экземпляр, а затем использовать его. – diceler
Если у метода есть ограничение 'where T: new', вы просто вызываете' new T() '. Методы Code Contracts, вероятно, также имеют это ограничение или используют специализированные версии, например. исключения аргументов. Исходный код [доступен в Github] (https://github.com/Microsoft/CodeContracts) –