Domanda

Sto provando a derivare il tipo di un oggetto in fase di esecuzione. In particolare, devo sapere due cose se implementa ICollection o IDto. Attualmente la mia unica soluzione che sono riuscito a trovare è questa:

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

Comunque sono convinto che ci debba essere un modo migliore di questo. Ho provato a confrontare in modo normale come:

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

Tuttavia, ciò fallisce quando si utilizza la riflessione ma quando non si utilizza la riflessione funziona bene.

Non voglio scorrere le interfacce per ogni campo della mia entità. Qualcuno potrebbe far luce su un altro metodo in cui farlo? Sì, sto ottimizzando prematuramente, ma sembra anche brutto, quindi per favore mi umorizzi.

Avvertenze:

  1. Potrebbe o non potrebbe essere generico, come IList < > o semplicemente ArrayList quindi perché sto cercando ICollection o ICollection < > ;. Quindi suppongo che dovrei usare IsGenericType in un'istruzione if per sapere se testare usando ICollection & Lt; & Gt; o no.

Grazie in anticipo!

È stato utile?

Soluzione

Questa:

type == typeof(ICollection)

verificherà se il tipo di proprietà è esattamente ICollection. Cioè, tornerà vero per:

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

ma non per:

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

Se vuoi verificare se il tipo di proprietà è, o è derivato da , Type.IsAssignableFrom, il modo più semplice è usare <=>:

typeof(ICollection).IsAssignableFrom(type)

e lo stesso vale per generico:

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

Altri suggerimenti

type.IsAssignable aiuta in questo caso?

EDIT: mi dispiace, avrebbe dovuto essere Type.IsAssignableFrom

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top