using System; using System.Collections.Generic; using System.ComponentModel; using System.IO; using System.Reflection; namespace BizHawk.Common.ReflectionExtensions { /// /// Reflection based helper methods /// public static class ReflectionExtensions { /// /// Gets the description attribute from an object /// public static string GetDescription(this object obj) { var type = obj.GetType(); var memInfo = type.GetMember(obj.ToString()); if (memInfo.Length > 0) { var attrs = memInfo[0].GetCustomAttributes(typeof(DescriptionAttribute), false); if (attrs.Length > 0) { return ((DescriptionAttribute)attrs[0]).Description; } } return obj.ToString(); } /// /// Gets the description attribute from a type /// /// public static string Description(this Type type) { var descriptions = (DescriptionAttribute[]) type.GetCustomAttributes(typeof(DescriptionAttribute), false); if (descriptions.Length == 0) { return string.Empty; } return descriptions[0].Description; } /// /// Gets an enum from a description attribute /// /// The type of the enum /// The description attribute value /// An enum value with the given description attribute, if no suitable description is found then a default value of the enum is returned /// http://stackoverflow.com/questions/4367723/get-enum-from-description-attribute public static T GetEnumFromDescription(this string description) { var type = typeof(T); if (!type.IsEnum) throw new InvalidOperationException(); foreach (var field in type.GetFields()) { var attribute = Attribute.GetCustomAttribute(field, typeof(DescriptionAttribute)) as DescriptionAttribute; if (attribute != null) { if (attribute.Description == description) { return (T)field.GetValue(null); } } else { if (field.Name == description) { return (T)field.GetValue(null); } } } return default(T); } /// /// Takes an object and determines if it has methodName as a public method /// /// Returns whether or not the obj both contains the method name and the method is public public static bool HasExposedMethod(this object obj, string methodName) { var method = obj.GetType().GetMethod(methodName); if (method != null) { return method.IsPublic; } return false; } /// /// Takes an object and invokes the method /// The method must exist and be public /// /// The return value of the method, as an object. /// If the method returns void, the return value is null /// If the method does not exist or is not public, it returns null /// public static object InvokeMethod(this object obj, string methodName, object[] args) { var method = obj.GetType().GetMethod(methodName); if (method != null && method.IsPublic) { return method.Invoke(obj, args); } return null; } public static bool HasPublicProperty(this object obj, string propertyName) { var property = obj.GetType().GetProperty(propertyName); if (property != null) { return property.CanRead; } return false; } public static object GetPropertyValue(this object obj, string propertyName) { var property = obj.GetType().GetProperty(propertyName); if (property != null && property.CanRead) { return property.GetValue(obj, null); } return null; } /// /// Takes an enum Type and generates a list of strings from the description attributes /// /// public static IEnumerable GetEnumDescriptions(this Type type) { var vals = Enum.GetValues(type); foreach (var v in vals) { yield return v.GetDescription(); } } } }