Magazine Internet

[Linq] Retourner la liste de toutes les propriétés d'un Type

Publié le 18 décembre 2008 par Jeremy.jeanson

Microsoft nous a gratifié de très bonnes classes dans le namespace System.Reflection, cependant celle-ci ne couvrent pas tous les cas. par exemple la Méthode GetProperties() permet bien d' obtenir les propriétés d'une classe, mais est incapable de fournir celles d'une interface implémentant une ou plusieurs autres interfaces.

Heureusement, Linq est là ! Voici ma solution, basé sur Linq et l'utilisation de Dinstinct (expliquée dans un précédent post)

        /// <summary>
        /// Retoune la liste de toutes les propriétés d'un type
        /// </summary>
        /// <param name="t"></param>
        /// <returns></returns>
        public static System.Reflection.PropertyInfo[] GetAllproperties(this Type t)
        {
            return (t.GetProperties()
                .Concat(
                t.GetInterfaces().SelectMany(c => c.GetProperties()))
                )
                .Distinct(new EqualityComparerProperty())
                .ToArray();
        }

        /// <summary>
        /// Classe servant à la comparaison des propriétés par leurs noms
        /// </summary>
        private class EqualityComparerProperty 
                : IEqualityComparer<System.Reflection.PropertyInfo>
        {
            /// <summary>
            /// Egalité
            /// </summary>
            /// <param name="x"></param>
            /// <param name="y"></param>
            /// <returns></returns>
            public bool Equals(System.Reflection.PropertyInfo x, System.Reflection.PropertyInfo y)
            {
                return x.Name == y.Name;
            }

            /// <summary>
            /// HashCode de l'élément servant à la comparaison
            /// </summary>
            /// <param name="obj"></param>
            /// <returns></returns>
            public int GetHashCode(System.Reflection.PropertyInfo obj)
            {
                return obj.Name.GetHashCode();
            }
        }

Ma méthode consiste à lister les propriétés du type et à leur ajouter la liste des propriété de toutes les interfaces, puis à les distinguer les unes des autres par leur nom.


Retour à La Une de Logo Paperblog

A propos de l’auteur


Jeremy.jeanson 1573 partages Voir son profil
Voir son blog

l'auteur n'a pas encore renseigné son compte l'auteur n'a pas encore renseigné son compte