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