Frage

Ich versuche, den Typ eines Objekts zur Laufzeit abzuleiten. Insbesondere muss ich zwei Dinge wissen, ob es ICollection oder IDto implementiert. Zur Zeit meine einzige Lösung, die ich der Lage gewesen zu finden, ist dies:

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

Allerdings bin ich davon überzeugt, es muss ein besserer Weg, als diese sein. Ich habe in einer normalen Art und Weise versucht, zu vergleichen, wie:

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

Allerdings scheitert dies, wenn noch mit Reflexion, wenn sie nicht mithilfe von Reflektion es funktioniert gut.

Ich will nicht über die Schnittstellen für jedes Feld meiner Einheit iterieren. Könnte jemand etwas Licht auf ein anderes Verfahren, bei dem Schuppen, dies zu tun? Ja, ich bin zu früh zu optimieren, aber es sieht hässlich auch so Humor mich bitte.

Caveats:

  1. Es könnte oder könnte nicht generisch, wie IList sein <> oder einfach nur so Arraylist, warum ich für ICollection oder ICollection Suche <>. Also gehe ich davon aus ich IsGenericType in einem verwenden soll, wenn Aussage zu wissen, ob ICollection mit testen <> oder nicht.

Vielen Dank im Voraus!

War es hilfreich?

Lösung

Dieses:

type == typeof(ICollection)

wird überprüfen, ob die Art der Eigenschaft ist genau ICollection. Das heißt, es wird return true für:

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

, aber nicht für:

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

Wenn Sie überprüfen wollen, ob die Art der Immobilie ist, oder abgeleitet ist, ICollection, ist der einfachste Weg Type.IsAssignableFrom zu verwenden:

typeof(ICollection).IsAssignableFrom(type)

und das gleiche gilt für generic:

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

Andere Tipps

Hat type.IsAssignable Hilfe in diesem Fall?

EDIT: Sorry, es sollte Type.IsAssignableFrom wurde

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top