using System;
using System.Reflection;
namespace SnapDragon.Utilities
{
///
/// Provides methods for retrieving enum and attribute values through reflection.
///
public static class AttributeReflector
{
///
/// Converts the string representation of the specified enum value.
///
/// Type of attribute to parse.
/// A string containing the value to parse.
/// When this method returns, contains the attribute value, if the conversion succeeded, or default if it fails.
///
public static bool TryParse(string value, out T output)
{
output = default(T);
if(!Enum.IsDefined(typeof(T), value))
{
return false;
}
output = (T) Enum.Parse(typeof (T), value, true);
return true;
}
///
/// Retrieves the enum field associated with the specified value. A return value indicates whether the conversion succeeded.
///
/// Type of enum.
/// Type of attribute to retrieve.
/// Value of the attribute.
///
///
///
public static bool TryGetFieldFromAttributeValue(string value, out T output, Func predicate)
where TAttribute : Attribute
{
output = default(T);
bool found = false;
string attributeValue = null;
Type type = typeof(T);
FieldInfo[] fields = type.GetFields();
// needs to start at 1 because GetFields includes a __value for enums
for (int i = 1; i < fields.Length; ++i)
{
//Check for our custom attribute
TAttribute[] attrs = fields[i].GetCustomAttributes(typeof(TAttribute), false) as TAttribute[];
if (attrs != null && attrs.Length != 0)
{
attributeValue = predicate(attrs[0]);
}
//Check for equality then select actual enum value.
if (string.Compare(attributeValue, value, true) == 0)
{
output = (T)Enum.Parse(type, fields[i].Name);
found = true;
break;
}
}
return found;
}
}
}