Как мне сравнивать типы при использовании дженериков?
-
05-07-2019 - |
Вопрос
Я пытаюсь вывести тип объекта во время выполнения.В частности, мне нужно знать две вещи, реализует ли он ICollection или IDto.В настоящее время мое единственное решение, которое я смог найти, это:
private static bool IsACollection(PropertyDescriptor descriptor)
{
bool isCollection = false;
foreach (Type type in descriptor.PropertyType.GetInterfaces())
{
if (type.IsGenericType)
{
if (type.GetGenericTypeDefinition() == typeof(ICollection<>))
{
isCollection = true;
break;
}
}
else
{
if (type == typeof(ICollection))
{
isCollection = true;
break;
}
}
}
return isCollection;
}
private static bool IsADto(PropertyDescriptor descriptor)
{
bool isDto = false;
foreach (Type type in descriptor.PropertyType.GetInterfaces())
{
if (type == typeof(IDto))
{
isDto = true;
break;
}
}
return isDto;
}
Однако я убежден, что должен быть лучший способ, чем этот.Я пробовал сравнивать обычным способом, таким как:
if(descriptor.PropertyType == typeof(ICollection<>))
Однако это приводит к сбою при использовании отражения, но при отсутствии отражения все работает нормально.
Я не хочу перебирать интерфейсы для каждого поля моей сущности.Может ли кто-нибудь пролить некоторый свет на другой метод, с помощью которого это можно сделать?Да, я преждевременно оптимизирую, но это тоже выглядит некрасиво, так что, пожалуйста, отнеситесь ко мне с юмором.
Предостережения:
- Это может быть или не быть общим, например IList<> или просто ArrayList таким образом, почему я ищу ICollection или ICollection<>.Итак, я предполагаю, что мне следует использовать IsGenericType в операторе if, чтобы узнать, следует ли тестировать с помощью ICollection<> или нет.
Заранее спасибо!
Решение
Это:
type == typeof(ICollection)
проверит, соответствует ли тип собственности именно так ICollection
.То есть, он вернет true для:
public ICollection<int> x { get; set; }
но не для:
public List<int> x { get; set; }
Если вы хотите проверить, соответствует ли тип собственности, или является производным от, ICollection
, самый простой способ - использовать Type.IsAssignableFrom
:
typeof(ICollection).IsAssignableFrom(type)
и то же самое касается дженериков:
typeof(ICollection<>).IsAssignableFrom(type.GetGenericTypeDefinition())
Другие советы
Делает type.IsAssignable
помочь в этом случае?
Редактировать:Извини, это должно было быть Type.IsAssignableFrom