此问题之前已经有过不同的问题,但答案对我没有帮助,因为(1)我无法控制内置Exception
类,(2){{ 1}}返回一个对象/实例,我需要一个真正的动态类型。
我正在尝试创建一个扩展方法,允许我根据我捕获的异常从我的WCF服务中抛出Activator.CreateInstance()
。例如:
FaultException
是直截了当的。但是如果我想以一般方式扩展它,我会使用扩展类,如:
try {
...
}
catch (ArgumentNullException exc) {
throw new FaultException<ArgumentNullException>(exc);
}
当我挂断电话时,当然是扩展方法的实现:
try {
...
}
catch (Exception exc) {
exc.ThrowFaultException();
}
答案 0 :(得分:3)
试试这个:
public static void ThrowFaultException<TException>(this TException ex) where TException : System.Exception
{
throw new FaultException<TException>(ex);
}
答案 1 :(得分:1)
您不需要将Activator.CreateInstance返回的对象强制转换为FaultException&lt;?&gt;扔掉它。将它转换为Exception就足够了:
var type = typeof(FaultException<>).MakeGenericType(exc.GetType());
throw (Exception)Activator.CreateInstance(type, exc);
我不会在ThrowFaultException
中抛出异常:
try
{
...
}
catch (Exception e)
{
throw e.WrapInFaultException();
}
public static Exception WrapInFaultException(this Exception e)
{
var type = typeof(FaultException<>).MakeGenericType(e.GetType());
return (Exception)Activator.CreateInstance(type, e);
}
答案 2 :(得分:1)
public static void ThrowFaultException(this Exception exc)
{
// Gives me the correct type...
Type exceptionType = exc.GetType();
var genericType = typeof(FaultException<>).MakeGenericType(exceptionType);
// But how the heck do I use it?
throw (Exception)Activator.CreateInstance(genericType, exc);
}