Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/319.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 需要动态泛型类型的异常的扩展方法_C#_Wcf_Generics_Exception_Exception Handling - Fatal编程技术网

C# 需要动态泛型类型的异常的扩展方法

C# 需要动态泛型类型的异常的扩展方法,c#,wcf,generics,exception,exception-handling,C#,Wcf,Generics,Exception,Exception Handling,以前有人以不同的方式问过这个问题,但答案对我没有帮助,因为(1)我无法控制内置的异常类,以及(2)Activator.CreateInstance()返回一个对象/实例,其中我需要一个真正的动态类型 我正在尝试创建一个扩展方法,允许我根据捕获的异常从WCF服务中抛出FaultException。例如: try { ... } catch (ArgumentNullException exc) { throw new FaultException<ArgumentNullEx

以前有人以不同的方式问过这个问题,但答案对我没有帮助,因为(1)我无法控制内置的
异常
类,以及(2)
Activator.CreateInstance()
返回一个对象/实例,其中我需要一个真正的动态类型

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

try {
    ...
}
catch (ArgumentNullException exc) {
    throw new FaultException<ArgumentNullException>(exc);
}
当然,我挂断电话的是扩展方法的实现:

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);
}
公共静态void ThrowFaultException(此异常exc){
//给我正确的类型。。。
类型exceptionType=exc.GetType();
//但我该怎么用呢?
抛出新的FaultException(exc);
}

答案是否定的,没有帮助。有什么想法吗?

您不需要将Activator.CreateInstance返回的对象强制转换为FaultException来抛出它。将其强制转换为异常就足够了:

var type = typeof(FaultException<>).MakeGenericType(exc.GetType());

throw (Exception)Activator.CreateInstance(type, exc);

您不需要将Activator.CreateInstance返回的对象强制转换为FaultException来抛出它。将其强制转换为异常就足够了:

var type = typeof(FaultException<>).MakeGenericType(exc.GetType());

throw (Exception)Activator.CreateInstance(type, exc);
公共静态void ThrowFaultException(此异常exc)
{
//给我正确的类型。。。
类型exceptionType=exc.GetType();
var genericType=typeof(FaultException)。MakeGenericType(exceptionType);
//但我该怎么用呢?
抛出(异常)Activator.CreateInstance(genericType,exc);
}
公共静态void ThrowFaultException(此异常exc)
{
//给我正确的类型。。。
类型exceptionType=exc.GetType();
var genericType=typeof(FaultException)。MakeGenericType(exceptionType);
//但我该怎么用呢?
抛出(异常)Activator.CreateInstance(genericType,exc);
}
试试这个:

public static void ThrowFaultException<TException>(this TException ex) where TException : System.Exception
{
    throw new FaultException<TException>(ex);
}
公共静态void ThrowFaultException(此TexException ex),其中TexException:System.Exception
{
抛出新的FaultException(ex);
}
试试这个:

public static void ThrowFaultException<TException>(this TException ex) where TException : System.Exception
{
    throw new FaultException<TException>(ex);
}
公共静态void ThrowFaultException(此TexException ex),其中TexException:System.Exception
{
抛出新的FaultException(ex);
}


为什么不能将返回从
Activator.CreateInstance()
转换为
异常
?它仍然会作为它的实际类型被抛出,不是吗?最好从自定义代码而不是从某个通用方法抛出异常。这将有助于VS.Net和其他代码分析器(包括您的同行)检测无法访问的代码和相关问题。BR/DP>我在测试该解决方案时发现,调用方在常规catch(exception exc){}处理程序下捕获了异常,不是FaultExceptionDK>你能详细说明一下吗?James B>这只是一般性的考虑,与问题没有直接关系。。。想象一下,稍后初级开发人员会在每个异常处理的末尾添加日志记录。在“throw”出现的第一个代码段中,编译器将立即警告他,Log.LogError()调用不能放在throw语句之后,因为它将不可访问;事实上,开发人员甚至不太可能尝试这样做。在使用第二个代码段的情况下,对于开发人员来说更为晦涩,编译器也没有帮助。HTH.为什么不能将返回从
Activator.CreateInstance()
转换为
异常
?它仍然会作为它的实际类型被抛出,不是吗?最好从自定义代码而不是从某个通用方法抛出异常。这将有助于VS.Net和其他代码分析器(包括您的同行)检测无法访问的代码和相关问题。BR/DP>我在测试该解决方案时发现,调用方在常规catch(exception exc){}处理程序下捕获了异常,不是FaultExceptionDK>你能详细说明一下吗?James B>这只是一般性的考虑,与问题没有直接关系。。。想象一下,稍后初级开发人员会在每个异常处理的末尾添加日志记录。在“throw”出现的第一个代码段中,编译器将立即警告他,Log.LogError()调用不能放在throw语句之后,因为它将不可访问;事实上,开发人员甚至不太可能尝试这样做。在使用第二个代码段的情况下,对于开发人员来说更为晦涩,编译器也没有帮助。我正在考虑发布这个,但是他如何将exc作为参数传递给FaultException的构造函数呢?CreateInstance允许这样做吗?@Pandincus:我还没有测试过,但我相信上面显示的调用应该按原样工作。没关系,我看到你编辑了你的答案。妙计!如果我这样做,客户端将捕获一般异常,而不是FaultException:(我刚刚想发布这个,但他如何将exc作为参数传递给FaultException的构造函数?CreateInstance允许吗?@Pandincus:我还没有测试过,但我相信上面显示的调用应该可以按原样工作。没关系,我看到你为此编辑了答案。妙招!如果我这么做,客户端会捕获一个gener所有的例外,不是错误的例外:(完美地工作!!正是我想要的:)我总是忘记泛型的美丽!完美地工作!!正是我想要的:)我总是忘记泛型的美丽!
public static void ThrowFaultException<TException>(this TException ex) where TException : System.Exception
{
    throw new FaultException<TException>(ex);
}