繁体   English   中英

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

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM