我为web api应用程序创建了一个自定义异常过滤器。过滤器非常简单,并使用字典将异常类型映射到http状态代码。
this.Mappings = new Dictionary<Type, HttpStatusCode>
{
{typeof (ArgumentException), HttpStatusCode.BadRequest},
}
我遇到的问题是我定义了一个通用的异常类型:
class EntityNotFoundException<TEntity> : RepositoryException { /*... */ }
我想将此异常类型映射到HttpStatusCode.NotFound
。
this.Mappings = new Dictionary<Type, HttpStatusCode>
{
{typeof (ArgumentException), HttpStatusCode.BadRequest},
{typeof (EntityNotFoundException<>), HttpStatusCode.NotFound},
}
但是,因为泛型在编译时生成多个类,所以EntityNotFoundException的实例都没有实际匹配我的映射的键。
例如,如果我这样做:
throw new EntityNotFoundException<User>(userId);
过滤器会抓取异常,但是typeof(EntityNotFoundException<>)
和typeof(EntityNotFoundException<User>)
不会生成相同的散列。
我看到两个选项:
EntityNotFoundException<User>
映射到HttpStatusCode.NotFound
,这将为我的每个实体创建一个映射。有没有更清洁的解决方案?
答案 0 :(得分:4)
您可以使用以下内容将特定通用类型转换为通用通用类型(例如:从List<int>
到List<>
):
if (exceptionType.IsGenericType)
{
exceptionType = exceptionType.GetGenericTypeDefinition();
}
然后,您可以在字典中查找EntityNotFoundException<>
。