2015-08-03 2 views
0

Я дурачиться с обобщенными методами в последнее время и наткнулся на методы, которые выглядят следующим образом: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)?

+0

этот код контракты код? В этом случае 'Requires' означает больше, чем просто проверку состояния и исключение исключения –

+0

@PanagiotisKanavos Я видел его в Code Contracts yes. Меня не интересует то, что он делает, меня больше интересует, как можно взять общий тип, создать новый экземпляр, а затем использовать его. – diceler

+1

Если у метода есть ограничение 'where T: new', вы просто вызываете' new T() '. Методы Code Contracts, вероятно, также имеют это ограничение или используют специализированные версии, например. исключения аргументов. Исходный код [доступен в Github] (https://github.com/Microsoft/CodeContracts) –

ответ

3

Согласно MSDN: System.Exception имеет конструктор, который принимает строку в качестве аргумента. Эта строка представляет сообщение.

С помощью объекта Activator-Class вы можете сделать следующее довольно просто:

using System; 

public class Test 
{ 

    public static void Requires<TException>(bool condition, string message) 
where TException : Exception 
{ 
    Exception exception = (Exception)Activator.CreateInstance(typeof(TException),message); 
    throw exception; 
} 

    public static void Main() 
    { 
     try 
     { 
      Requires<ArgumentNullException>(true,"Test"); 
     } 
     catch(Exception e) 
     { 
      Console.WriteLine(e); 
     } 

    } 
} 

Рабочий пример: http://ideone.com/BeHYUO

2

Насколько я понимаю, при использовании вышеуказанного метода вы предоставляете Type, который наследует от Exception, и если условие false, генерируется предоставленный тип исключения.

Это зависит от реализации метода, все это говорит, что параметр типа метода Requires должен иметь базовый тип Exception. Но очень вероятно, что он создает исключение этого типа, если условие равно false. Один из способов сделать это с помощью метода Activator.CreateInstance.

+0

Конечно, я с вами до сих пор. Но что, если мне нужно создать новый экземпляр этого «Типа» в методе, который я делаю сам? – diceler

+1

Если тип имеет ограничение 'new', вы можете просто вызвать' new TException() ' –

+0

. Вы можете использовать' default (Type) 'или если у вас есть ограничение' new() ', вы можете использовать' new Type() '. –

1

И как вы можете передать в параметре сообщения, если тип неизвестен методу

Аналогично к ответу Ned Стоянов «s, это до человека, реализующего способ решить как этот параметр будет использоваться. Он может использоваться как сообщение, вложенное в исключение, его можно использовать где-то еще или его нельзя использовать вообще. Имя параметра указывает только на то, для чего оно будет использоваться, но у вызывающего нет гарантии, что он будет использоваться, как он ожидает. Его можно было бы также назвать djfhsfjfh.

Смежные вопросы