Question

J'essaie de dériver le type d'un objet au moment de l'exécution. Plus précisément, j'ai besoin de savoir deux choses s'il implémente ICollection ou IDto. Actuellement, ma seule solution que j'ai pu trouver est la suivante:

   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;
    }

Cependant, je suis convaincu qu'il doit exister un meilleur moyen que celui-ci. J'ai essayé de comparer de manière normale, par exemple:

if(descriptor.PropertyType == typeof(ICollection<>))

Cependant, cela échoue lors de l'utilisation de la réflexion et pourtant, lorsque vous ne l'utilisez pas, cela fonctionne correctement.

Je ne souhaite pas parcourir les interfaces pour chaque champ de mon entité. Quelqu'un pourrait-il nous éclairer sur un autre moyen de procéder? Oui, j'optimise prématurément, mais ça a l'air moche aussi, alors s'il vous plaît, amusez-vous-moi.

Mises en garde:

  1. Il pourrait ou non être générique, tel que IList < > ou juste ArrayList donc pourquoi je cherche ICollection ou ICollection < > ;. Donc, je suppose que je devrais utiliser IsGenericType dans une instruction if pour savoir s'il faut tester avec ICollection & Lt; & Gt; ou pas.

Merci d'avance!

Était-ce utile?

La solution

Ceci:

type == typeof(ICollection)

vérifiera si le type de propriété est exactement ICollection. C’est-à-dire que cela reviendra vrai pour:

public ICollection<int> x { get; set; }

mais pas pour:

public List<int> x { get; set; }

Si vous souhaitez vérifier si le type de propriété est ou est dérivé de , Type.IsAssignableFrom, le moyen le plus simple consiste à utiliser <=>:

typeof(ICollection).IsAssignableFrom(type)

et il en va de même pour le générique:

typeof(ICollection<>).IsAssignableFrom(type.GetGenericTypeDefinition())

Autres conseils

Est-ce que type.IsAssignable vous aide dans ce cas?

EDIT: Désolé, cela aurait dû être Type.IsAssignableFrom

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top