2010-09-04 3 views

Répondre

2

le moyen le plus (et mieux) méthode est d'appeler Activator.CreateInstance vous-même est ce que le compilateur C# ne fait, comme la contrainte new() assure simplement que le type spécifié a un constructeur parameterless;?. appeler new TException() utilise effectivement Activator.CreateInstance pour instancier le type.

Quelque chose comme ça fonctionnerait:

throw (Exception)Activator.CreateInstance(typeof(TException), exception); 
+1

+1 Intéressant, merci pour l'arrière-plan sur ce C# compilateur est en train de faire. –

+0

Cela a totalement fonctionné! –

1

je trouve la meilleure façon de le faire est d'avoir le type en question prendre une lambda usine en plus du paramètre générique. Cette usine lambda est responsable de la création d'une instance d'un paramètre générique pour certains paramètres. Par exemple

void TheMethod<TException>(Func<Exception,TException> factory) { 
    ... 
    catch (Exception ex) { 
    var wrapped = factory(ex); 
    ... 
    } 
} 

Aussi j'ai écrit un article de blog sur ce problème récemment qui va sur différentes façons de résoudre ce problème

Questions connexes