#region CPL License /* Nuclex Framework Copyright (C) 2002-2012 Nuclex Development Labs This library is free software; you can redistribute it and/or modify it under the terms of the IBM Common Public License as published by the IBM Corporation; either version 1.0 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the IBM Common Public License for more details. You should have received a copy of the IBM Common Public License along with this library */ #endregion using System; using System.Collections.Generic; using System.Diagnostics; using System.Reflection; namespace Nuclex.Support { /// Helper methods for enumerations public static class EnumHelper { /// Returns the highest value encountered in an enumeration /// /// Enumeration of which the highest value will be returned /// /// The highest value in the enumeration public static EnumType GetHighestValue() where EnumType : IComparable { EnumType[] values = GetValues(); // If the enumeration is empty, return nothing if(values.Length == 0) { return default(EnumType); } // Look for the highest value in the enumeration. We initialize the highest value // to the first enumeration value so we don't have to use some arbitrary starting // value which might actually appear in the enumeration. EnumType highestValue = values[0]; for(int index = 1; index < values.Length; ++index) { if(values[index].CompareTo(highestValue) > 0) { highestValue = values[index]; } } return highestValue; } /// Returns the lowest value encountered in an enumeration /// /// Enumeration of which the lowest value will be returned /// /// The lowest value in the enumeration public static EnumType GetLowestValue() where EnumType : IComparable { EnumType[] values = GetValues(); // If the enumeration is empty, return nothing if(values.Length == 0) { return default(EnumType); } // Look for the lowest value in the enumeration. We initialize the lowest value // to the first enumeration value so we don't have to use some arbitrary starting // value which might actually appear in the enumeration. EnumType lowestValue = values[0]; for(int index = 1; index < values.Length; ++index) { if(values[index].CompareTo(lowestValue) < 0) { lowestValue = values[index]; } } return lowestValue; } /// Retrieves a list of all values contained in an enumeration /// /// Type of the enumeration whose values will be returned /// /// All values contained in the specified enumeration /// /// This method produces collectable garbage so it's best to only call it once /// and cache the result. /// public static EnumType[] GetValues() { #if XBOX360 || WINDOWS_PHONE return GetValuesXbox360(); #else return (EnumType[])Enum.GetValues(typeof(EnumType)); #endif } /// Retrieves a list of all values contained in an enumeration /// /// Type of the enumeration whose values will be returned /// /// All values contained in the specified enumeration internal static EnumType[] GetValuesXbox360() { Type enumType = typeof(EnumType); if(!enumType.IsEnum) { throw new ArgumentException( "The provided type needs to be an enumeration", "EnumType" ); } // Use reflection to get all fields in the enumeration FieldInfo[] fieldInfos = enumType.GetFields( BindingFlags.Public | BindingFlags.Static ); // Create an array to hold the enumeration values and copy them over from // the fields we just retrieved EnumType[] values = new EnumType[fieldInfos.Length]; for(int index = 0; index < fieldInfos.Length; ++index) { values[index] = (EnumType)fieldInfos[index].GetValue(null); } return values; } } } // namespace Nuclex.Support