Тип универсального типа в качестве словаря не работает

Я создал настраиваемый фильтр исключений для моего приложения web api. Фильтр довольно прост и использует словарь для сопоставления типов исключений с кодами состояния http.

this.Mappings = new Dictionary<type, httpstatuscode="">
{
 {typeof (ArgumentException), HttpStatusCode.BadRequest},
}
</type,>

Проблема в том, что я определил общий тип исключения:

class EntityNotFoundException<tentity> : RepositoryException { /*... */ }
</tentity>

И я хочу сопоставить этот тип исключения с HttpStatusCode.NotFound.

this.Mappings = new Dictionary<type, httpstatuscode="">
{
 {typeof (ArgumentException), HttpStatusCode.BadRequest},
 {typeof (EntityNotFoundException<>), HttpStatusCode.NotFound},
}
</type,>

Однако, поскольку generics генерируют несколько классов при компиляции, ни один из экземпляров EntityNotFoundException фактически не соответствует ключу моих сопоставлений.

Например, если я это сделаю:

throw new EntityNotFoundException<user>(userId);
</user>

Фильтр делает исключение, однако typeof(EntityNotFoundException<>) и typeof(EntityNotFoundException<user>)</user> не генерируют один и тот же хэш.

Я вижу два варианта:

  1. Удалите generic и добавьте аргумент Type в мое исключение ctor;
  2. Map EntityNotFoundException в HttpStatusCode.NotFound, который создаст сопоставление для каждого моего объекта.

Есть ли более чистые решения?

1 ответ

Вы можете преобразовать определенный общий тип в общий общий тип (например: из List в List<>), используя следующее:

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

Затем вы можете выполнить поиск в своем словаре, чтобы найти EntityNotFoundException<>.

licensed under cc by-sa 3.0 with attribution.