Retrieves the enum field associated with the specified value. A return value indicates whether the conversion succeeded.
using System;
using System.Reflection;
namespace SnapDragon.Utilities
{
/// <summary>
/// Provides methods for retrieving enum and attribute values through reflection.
/// </summary>
public static class AttributeReflector
{
/// <summary>
/// Converts the string representation of the specified enum value.
/// </summary>
/// <typeparam name="T">Type of attribute to parse.</typeparam>
/// <param name="value">A string containing the value to parse.</param>
/// <param name="output">When this method returns, contains the attribute value, if the conversion succeeded, or default if it fails.</param>
/// <returns></returns>
public static bool TryParse<T>(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;
}
/// <summary>
/// Retrieves the enum field associated with the specified value. A return value indicates whether the conversion succeeded.
/// </summary>
/// <typeparam name="T">Type of enum.</typeparam>
/// <typeparam name="TAttribute">Type of attribute to retrieve.</typeparam>
/// <param name="value">Value of the attribute.</param>
/// <param name="output"></param>
/// <param name="predicate"></param>
/// <returns></returns>
public static bool TryGetFieldFromAttributeValue<T, TAttribute>(string value, out T output, Func<TAttribute, string> 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;
}
}
}
Related examples in the same category