Как мне сравнивать типы при использовании дженериков?

StackOverflow https://stackoverflow.com/questions/1201753

Вопрос

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

Однако это приводит к сбою при использовании отражения, но при отсутствии отражения все работает нормально.

Я не хочу перебирать интерфейсы для каждого поля моей сущности.Может ли кто-нибудь пролить некоторый свет на другой метод, с помощью которого это можно сделать?Да, я преждевременно оптимизирую, но это тоже выглядит некрасиво, так что, пожалуйста, отнеситесь ко мне с юмором.

Предостережения:

  1. Это может быть или не быть общим, например 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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top