通用类型的类型为字典键不起作用

时间:2014-12-12 20:49:17

标签: c# .net asp.net-web-api

我为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>)不会生成相同的散列。

我看到两个选项:

  1. 删除泛型并将Type参数添加到我的异常的ctor;
  2. EntityNotFoundException<User>映射到HttpStatusCode.NotFound,这将为我的每个实体创建一个映射。
  3. 有没有更清洁的解决方案?

1 个答案:

答案 0 :(得分:4)

您可以使用以下内容将特定通用类型转换为通用通用类型(例如:从List<int>List<>):

if (exceptionType.IsGenericType)
{
    exceptionType = exceptionType.GetGenericTypeDefinition();
}

然后,您可以在字典中查找EntityNotFoundException<>