我有这样的情况:
public class Foo{}
public interface IBar<in TEx>
where TEx : Exception
{
Foo Build(TEx ex);
}
public class FooFactory{
public Foo Create<TEx>(TEx ex) where TEx : Exception{
// blah
}
}
Run Code Online (Sandbox Code Playgroud)
如果我调用FooFactory.Create方法传递任何Exception类型,一切正常.当我做这样的事情时,事情开始变得很奇怪:
// this is an external class, cannot be changed.
public class ExceptionContext{
public Exception Ex{get; set;}
}
var context = new ExceptionContext(){ Ex = new MyCustomException (); }
var factory = new FooFactory();
var fooInstance = factory.Create(context.Ex);
Run Code Online (Sandbox Code Playgroud)
当我调用时FooFactory.Create(),传递的异常总是类型System.Exception,而不是MyCustomException我所期望的.
有什么建议吗?
编辑:只是为了给出一点上下文,我试图在Microsoft.AspNetCore.Mvc.Filters.IExceptionFilter的自定义实现的OnException(ExceptionContext context)方法中运行异常特定的代码.
当我调用时
FooFactory.Create(),传递的异常总是类型System.Exception
这是因为静态类型的ExceptionContext.Ex是Exception.泛型方法在编译时绑定,它不知道异常的动态运行时类型是不同的.
下一个最好的办法是使用显式强制转换在编译时指定运行时类型:
var fooInstance = factory.Create((MyCustomException)context.Ex);
Run Code Online (Sandbox Code Playgroud)
这显然假设运行时类型是MyCustomException.如果不是,您将获得无效的强制转换异常.
您还可以使用dynamic将方法解析推迟到运行时:
dynamic fooInstance = factory.Create((dynamic)context.Ex);
Run Code Online (Sandbox Code Playgroud)
这里的风险是任何fooInstance通过动态使用will的东西,所以你没有编译时安全性,并且在运行时才会发现任何错误(拼写错误的名称,错误的参数类型).
编辑
删除了这部分答案,因为ExceptionContext不受OP控制.
你也可以制作ExceptionContext通用的:
public class ExceptionContext<TEx>
where TEx : Exception
{
public <TEx> Ex{get; set;}
}
var context = new ExceptionContext<MyCustomException>(){ Ex = new MyCustomException (); }
var factory = new FooFactory();
var fooInstance = factory.Create(context.Ex);
Run Code Online (Sandbox Code Playgroud)
或者,如果要使用参数推断,请添加构造函数:
public class ExceptionContext<TEx>
where TEx : Exception
{
public ExceptionContext(TEx exception)
{
this.Ex = exception;
{
public <TEx> Ex{get; set;}
}
var context = new ExceptionContext(new MyCustomException());
var factory = new FooFactory();
var fooInstance = factory.Create(context.Ex);
Run Code Online (Sandbox Code Playgroud)
但目前尚不清楚这是否适合您的整体计划.
| 归档时间: |
|
| 查看次数: |
103 次 |
| 最近记录: |