[英]Extension method to Exception requiring dynamic generic type
之前已经以不同的方式提出了这个问题,但是答案无济于事,因为(1)我无法控制内置的Exception
类,并且(2) Activator.CreateInstance()
返回一个对象/例如,我需要一个真正的动态类型。
我正在尝试创建一个扩展方法,该方法允许我根据捕获到的异常将FaultException
从WCF服务中抛出。 例如:
try {
...
}
catch (ArgumentNullException exc) {
throw new FaultException<ArgumentNullException>(exc);
}
是直截了当的。 但是,如果我想以一般方式扩展它,则可以使用扩展类,例如:
try {
...
}
catch (Exception exc) {
exc.ThrowFaultException();
}
我挂断电话的地方当然是扩展方法的实现:
public static void ThrowFaultException(this Exception exc) {
// Gives me the correct type...
Type exceptionType = exc.GetType();
// But how the heck do I use it?
throw new FaultException<???>(exc);
}
尝试这个:
public static void ThrowFaultException<TException>(this TException ex) where TException : System.Exception
{
throw new FaultException<TException>(ex);
}
您无需将Activator.CreateInstance返回的对象强制转换为FaultException <? 将其强制转换为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);
}
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);
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.