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.