需要动态泛型类型的Exception的扩展方法

时间:2010-12-03 18:53:10

标签: c# wcf generics exception exception-handling

此问题之前已经有过不同的问题,但答案对我没有帮助,因为(1)我无法控制内置Exception类,(2){{ 1}}返回一个对象/实例,我需要一个真正的动态类型。

我正在尝试创建一个扩展方法,允许我根据我捕获的异常从我的WCF服务中抛出Activator.CreateInstance()。例如:

FaultException

是直截了当的。但是如果我想以一般方式扩展它,我会使用扩展类,如:

try {
    ...
}
catch (ArgumentNullException exc) {
    throw new FaultException<ArgumentNullException>(exc);
}

当我挂断电话时,当然是扩展方法的实现:

try {
    ...
}
catch (Exception exc) {
    exc.ThrowFaultException();
}

答案herehere无济于事。有什么想法吗?

3 个答案:

答案 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);
    }