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

stu*_*e06 2 .net c# asp.net-web-api

我为我的 Web API 应用程序创建了一个自定义异常过滤器。该过滤器相当简单,并使用字典将异常类型映射到 http 状态代码。

\n\n
this.Mappings = new Dictionary<Type, HttpStatusCode>\n{\n    {typeof (ArgumentException), HttpStatusCode.BadRequest},\n}\n
Run Code Online (Sandbox Code Playgroud)\n\n

我遇到的问题是我定义了一个通用异常类型:

\n\n
class EntityNotFoundException<TEntity> : RepositoryException { /*... */ }\n
Run Code Online (Sandbox Code Playgroud)\n\n

我想将此异常类型映射到HttpStatusCode.NotFound.

\n\n
this.Mappings = new Dictionary<Type, HttpStatusCode>\n{\n    {typeof (ArgumentException), HttpStatusCode.BadRequest},\n    {typeof (EntityNotFoundException<>), HttpStatusCode.NotFound},\n}\n
Run Code Online (Sandbox Code Playgroud)\n\n

但是,由于泛型在编译时生成多个类,因此 EntityNotFoundException 的任何实例实际上都不与我的映射的键匹配。

\n\n

例如,如果我这样做:

\n\n
throw new EntityNotFoundException<User>(userId);\n
Run Code Online (Sandbox Code Playgroud)\n\n

过滤器确实捕获了异常,但是 \xc2\xad\xc2\xad\xc2\xad\xc2\xadtypeof(EntityNotFoundException<>)\xc2\xad\xc2\xad\xc2\xad\xc2\xad并且typeof(EntityNotFoundException<User>)不会生成相同的哈希值。

\n\n

我看到两个选择:

\n\n
    \n
  1. 删除泛型并将 Type 参数添加到我的异常的构造函数中;
  2. \n
  3. 映射EntityNotFoundException<User>HttpStatusCode.NotFound,这将为我的每个实体创建一个映射。
  4. \n
\n\n

有没有更清洁的解决方案?

\n

小智 5

您可以使用以下命令将特定泛型类型转换为其通用泛型类型(例如: fromList<int>到):List<>

if (exceptionType.IsGenericType)
{
    exceptionType = exceptionType.GetGenericTypeDefinition();
}
Run Code Online (Sandbox Code Playgroud)

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