c# - 如何使用泛型在基类的方法中指定输出参数的类型?

标签 c# generics exception enterprise-library

我正在将 ExceptionManager 包装在 Microsoft 的企业库的异常处理 block 中,并且我希望允许我的包装器的使用者指定包装器的实例化器允许重新抛出哪些异常类型。像这样:

public class MyExceptionManager<T> : Microsoft.Practices.EnterpriseLibrary.ExceptionHandling.ExceptionManager where T: MyCustomException
{
    ...
    public void LogWrapAndRethrow(Exception e, T t)
    {
        base.HandleException( e, "MyPolicyName", out t);
    }
...
}

我希望用户能够:

var em = new MyExceptionManager<MyCustomExceptionClass>();
var x = new MyCustomExceptionClass();
em.LogWrapAndRethrow(new Exception(),x);

...并在编译时检查

这是基本方法的签名:

public bool HandleException(Exception exceptionToHandle, string policyName, out Exception exceptionToThrow);

这不是泛型类。

不幸的是,即使 T 被限制为从 Exception 继承的类型,我仍然不断收到“...的最佳重载匹配有一些无效参数”。如果我手动创建并分配一个 Exception 变量,它将用作输出参数。

我做错了什么?

最佳答案

用于out 参数的参数必须完全匹配声明的参数类型。由于 HandleException 有第三个参数 out Exception exceptionToThrow,目前无法使用。

鉴于您不需要异常从您的方法中返回,将方法编写为最简单的方法:

public void LogWrapAndRethrow(Exception e, T t)
{
    Exception tmp = t;
    base.HandleException( e, "MyPolicyName", out tmp);
}

现在您正在使用 Exception 类型的参数调用该方法,所以没关系。

关于c# - 如何使用泛型在基类的方法中指定输出参数的类型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25391907/

相关文章:

java - 未处理的异常类型 Java InstantiationException

C++ API设计和错误处理

python - 构造方法异常

c# - Encog C#,VersatileMLDataSet from CSV,如何获取原始数据?

c# 通用接口(interface)不可能实现

c# - 如何通过参数化查询在数据库中插入空值

ios - 如何在运行时通过 Selector 在 Swift 中调用泛型函数?

Java:子类化泛型类

c# - 如何使用 EntityFramework 核心来单一化实体

c# - Microsoft 的反馈中心现在使我的 UWP 应用程序崩溃