using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Reflection; namespace Developpez.Dotnet.Reflection { /// /// Fournit des méthodes d'extension pour faciliter l'utilisation de la réflexion /// public static class ReflectionExtensions { #region Type extensions /// /// Détermine si un type hérite d'un autre type, ou implémente une interface /// /// Le type à vérifier /// Le type de base dont type doit hériter /// true si type est superType, hérite de superType, ou implémente superType. Sinon, false public static bool Is(this Type type, Type superType) { return superType.IsAssignableFrom(type); } /// /// Détermine si un type hérite d'un autre type, ou implémente une interface /// /// Le type de base dont type doit hériter /// Le type à vérifier /// true si type est T, hérite de T, ou implémente T. Sinon, false public static bool Is(this Type type) { return type.Is(typeof(T)); } /// /// Indique si un type est nullable. /// /// Type dont on veut vérifier s'il est nullable /// true si type est un type référence ou un type générique Nullable<T>, false sinon public static bool IsNullable(this Type type) { if (type.IsValueType) { return type.IsGenericType && type.GetGenericTypeDefinition() == typeof(Nullable<>); } return true; } /// /// Renvoie la valeur par défaut du type spécifié /// /// Le type dont on veut récupérer la valeur par défaut /// La valeur par défaut du type public static object GetDefaultValue(this Type type) { if (type.IsValueType && type != typeof(void)) return Activator.CreateInstance(type); return null; } /// /// Indique si un type est statique. /// /// Le type à tester /// true si le type est statique, false sinon public static bool IsStatic(this Type type) { return type.IsAbstract && type.IsSealed; } #endregion #region ICustomAttributeProvider extensions /// /// Détermine si un attribut est appliqué à un objet de réflexion. /// /// L'objet de réflexion à vérifier /// Le type de l'attribut à rechercher /// true si l'attribut spécifié est appliqué à l'objet de réflexion, false sinon public static bool HasAttribute(this ICustomAttributeProvider reflectionObject, Type attributeType) { return reflectionObject.IsDefined(attributeType, true); } /// /// Détermine si un attribut est appliqué à un objet de réflexion. /// /// L'objet de réflexion à vérifier /// Le type de l'attribut à rechercher /// true pour rechercher aussi dans les ancêtres, false sinon /// true si l'attribut spécifié est appliqué à l'objet de réflexion, false sinon public static bool HasAttribute(this ICustomAttributeProvider reflectionObject, Type attributeType, bool inherit) { return reflectionObject.IsDefined(attributeType, inherit); } /// /// Récupère les attributs appliqués à un objet de réflexion. /// /// L'objet de réflexion dont on veut récupérer les attributs /// Une liste des attributs appliqués à l'objet de réflexion public static IEnumerable GetAttributes(this ICustomAttributeProvider reflectionObject) { return reflectionObject.GetAttributes(true); } /// /// Récupère les attributs appliqués à un objet de réflexion. /// /// L'objet de réflexion dont on veut récupérer les attributs /// true pour rechercher aussi dans les ancêtres, false sinon /// Une liste des attributs du type demandé appliqués à l'objet de réflexion public static IEnumerable GetAttributes(this ICustomAttributeProvider reflectionObject, bool inherit) { return reflectionObject.GetCustomAttributes(inherit).Cast(); } /// /// Récupère les attributs appliqués à un objet de réflexion. /// /// L'objet de réflexion dont on veut récupérer les attributs /// Le type de l'attribut recherché /// Une liste des attributs du type demandé appliqués à l'objet de réflexion public static IEnumerable GetAttributes(this ICustomAttributeProvider reflectionObject, Type attributeType) { return reflectionObject.GetAttributes(attributeType, true); } /// /// Récupère les attributs appliqués à un objet de réflexion. /// /// L'objet de réflexion dont on veut récupérer les attributs /// Le type de l'attribut recherché /// true pour rechercher aussi dans les ancêtres, false sinon /// Une liste des attributs du type demandé appliqués à l'objet de réflexion public static IEnumerable GetAttributes(this ICustomAttributeProvider reflectionObject, Type attributeType, bool inherit) { return reflectionObject.GetCustomAttributes(attributeType, inherit).Cast(); } /// /// Récupère un attribut appliqué à un objet de réflexion. /// /// L'objet de réflexion dont on veut récupérer un attribut /// Le type de l'attribut recherché /// L'attribut recherché s'il existe, null sinon public static Attribute GetAttribute(this ICustomAttributeProvider reflectionObject, Type attributeType) { return reflectionObject.GetAttribute(attributeType, true); } /// /// Récupère un attribut appliqué à un objet de réflexion. /// /// L'objet de réflexion dont on veut récupérer un attribut /// Le type de l'attribut recherché /// true pour rechercher aussi dans les ancêtres, false sinon /// L'attribut recherché s'il existe, null sinon public static Attribute GetAttribute(this ICustomAttributeProvider reflectionObject, Type attributeType, bool inherit) { return reflectionObject.GetCustomAttributes(attributeType, inherit).Cast().FirstOrDefault(); } /// /// Détermine si un attribut est appliqué à un objet de réflexion. /// /// Le type de l'attribut à rechercher /// L'objet de réflexion à vérifier /// true si l'attribut spécifié est appliqué à l'objet de réflexion, false sinon public static bool HasAttribute(this ICustomAttributeProvider reflectionObject) where T : Attribute { return reflectionObject.HasAttribute(typeof(T)); } /// /// Détermine si un attribut est appliqué à un objet de réflexion. /// /// Le type de l'attribut à rechercher /// L'objet de réflexion à vérifier /// true pour rechercher aussi dans les ancêtres, false sinon /// true si l'attribut spécifié est appliqué à l'objet de réflexion, false sinon public static bool HasAttribute(this ICustomAttributeProvider reflectionObject, bool inherit) where T : Attribute { return reflectionObject.HasAttribute(typeof(T), inherit); } /// /// Récupère les attributs appliqués à un objet de réflexion. /// /// Le type de l'attribut recherché /// L'objet de réflexion dont on veut récupérer les attributs /// Une liste des attributs du type demandé appliqués à l'objet de réflexion public static IEnumerable GetAttributes(this ICustomAttributeProvider reflectionObject) where T : Attribute { return reflectionObject.GetAttributes(typeof(T)).Cast(); } /// /// Récupère les attributs appliqués à un objet de réflexion. /// /// Le type de l'attribut recherché /// L'objet de réflexion dont on veut récupérer les attributs /// true pour rechercher aussi dans les ancêtres, false sinon /// Une liste des attributs du type demandé appliqués à l'objet de réflexion public static IEnumerable GetAttributes(this ICustomAttributeProvider reflectionObject, bool inherit) where T : Attribute { return reflectionObject.GetAttributes(typeof(T), inherit).Cast(); } /// /// Récupère un attribut appliqué à un objet de réflexion. /// /// Le type de l'attribut recherché /// L'objet de réflexion dont on veut récupérer un attribut /// L'attribut recherché s'il existe, null sinon public static T GetAttribute(this ICustomAttributeProvider reflectionObject) where T : Attribute { return reflectionObject.GetAttribute(typeof(T)) as T; } /// /// Récupère un attribut appliqué à un objet de réflexion. /// /// Le type de l'attribut recherché /// L'objet de réflexion dont on veut récupérer un attribut /// true pour rechercher aussi dans les ancêtres, false sinon /// L'attribut recherché s'il existe, null sinon public static T GetAttribute(this ICustomAttributeProvider reflectionObject, bool inherit) where T : Attribute { return reflectionObject.GetAttribute(typeof(T), inherit) as T; } #endregion } }