2015-05-03 5 views
4

Я хотел бы иметь метод, который получает тип исключения (т. Е. Передаваемый параметр должен быть классом, который реализует System.Exception).Как передать тип исключения в качестве параметра?

Каков правильный способ сделать это?

Ниже не то, что я хочу:

public void SetException(Exception e) 

... что требуется экземпляр исключения. Я хочу передать тип исключения, как InvalidProgramException


Edit: Для дальнейшего объяснить, что я хочу делать, я хочу, чтобы иметь возможность отслеживать, сколько раз я видел исключение каждого типа раньше. Поэтому я хочу, чтобы иметь возможность сделать что-то вроде:

Dictionary<ExceptionTypeThing, int> ExceptionCounts; 

public void ExceptionSeen(ExceptionTypeThing e) 
{ 
    // Assume initialization 
    ExceptionCounts[e]++; 
} 

ExceptionSeen(InvalidProgramException); 

Я не хочу, чтобы передать экземпляр исключения, а отслеживать его тип исключения.

+1

Что вы хотите сделать? вы уверены, что вам это нужно? – Adrian

+1

Пожалуйста, объясните, что вы на самом деле пытаетесь сделать. Передача типа исключения является тривиальной (например,просто введите аргумент типа 'Type', а не type' Exception'), но неясно, относится ли это к вашей фактической потребности. Обратитесь к http://stackoverflow.com/help/how-to-ask за советом о том, как представить свой вопрос ясным и ответственным способом. –

+0

Существует несколько способов сделать это, но «лучший» способ зависит от того, как вы планируете использовать тип исключения внутри метода. Можете ли вы объяснить это более подробно? –

ответ

2

Похоже, вам нужен универсальный метод

public void SetException<TException>() where TException : Exception 
{ 
    ExceptionCounts[typeof(TException)]++; 
} 

Вы можете назвать его как

SetException<InvalidProgramException>(); 

Edit:

Dictionary<Type, int> ExceptionCounts; 
public void ExceptionSeen(Type type) 
{ 
    ExceptionCounts[type]++; 
} 

Называйте это, как

ExceptionSeen(typeof(MyException)); 

Или если у вас есть экземпляр исключения уже

ExceptionSeen(ex.GetType()); 
+0

@HenkHolterman Я смущен, поскольку OP сказал * Следующее не то, что я хочу: * Я предполагаю, что ему просто нужен тип исключения, а не экземпляр. –

+0

Вы правы, лучше добавьте пример использования здесь. –

+0

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

1

Если вы просто хотите передать тип, указать «Type» как тип paramteer, а затем, если вы хотите, чтобы убедиться, что это типа исключения вам нужно для проверки типа во время выполнения:

public void SetException(Type t) { 
    if (!typeof(Exception).IsAssignableFrom(t)) { 
     throw new ArgumentException("t"); 
    } 
} 
1

Определить общий метод, который делает не взять экземпляр, а затем использовать обобщенный тип ограничения, чтобы заставить его наследовать от Exception:

public void SetException<T>() where T : Exception 
{ 
} 
0

Как это:

public void SetException(Type type) 

SetException(typeof(InvalidProgramException)) 
// or 
SetException(e.GetType) 

Another вариантов является использование генериков, чтобы помочь

public void SetException<T>()  
SetException<InvalidProgramException>() 

или

public void SetException<T>(T exception)  
SetException(e); 
0

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

+2

На самом деле это не вопрос. –

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