如何使用泛型来指定基类中out参数的类型'方法

本文关键字:类型 参数 方法 out 泛型 何使用 基类 | 更新日期: 2023-09-27 18:18:48

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

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参数的类型'方法

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

考虑到你不需要异常从你的方法中返回,最简单的方法是这样写:

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

现在您正在使用类型为Exception的参数调用该方法,因此可以。