Я пытаюсь определить тип объекта во время выполнения. В частности, мне нужно знать две вещи, реализует ли он 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 <> или нет.
Заранее спасибо!