#region Copyright
// /************************************************************************
// Copyright (c) 2016 Jamie Rees
// File: EnumHelper.cs
// Created By: Jamie Rees
//
// Permission is hereby granted, free of charge, to any person obtaining
// a copy of this software and associated documentation files (the
// "Software"), to deal in the Software without restriction, including
// without limitation the rights to use, copy, modify, merge, publish,
// distribute, sublicense, and/or sell copies of the Software, and to
// permit persons to whom the Software is furnished to do so, subject to
// the following conditions:
//
// The above copyright notice and this permission notice shall be
// included in all copies or substantial portions of the Software.
//
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
// ************************************************************************/
# endregion
using System ;
using System.Collections.Generic ;
using System.ComponentModel.DataAnnotations ;
using System.Linq ;
using System.Reflection ;
namespace PlexRequests.Helpers
{
public static class EnumHelper < T >
{
public static IList < T > GetValues ( Enum value )
{
return value . GetType ( ) . GetFields ( BindingFlags . Static | BindingFlags . Public ) . Select ( fi = > ( T ) Enum . Parse ( value . GetType ( ) , fi . Name , false ) ) . ToList ( ) ;
}
public static T Parse ( string value )
{
return ( T ) Enum . Parse ( typeof ( T ) , value , true ) ;
}
public static IList < string > GetNames ( Enum value )
{
return value . GetType ( ) . GetFields ( BindingFlags . Static | BindingFlags . Public ) . Select ( fi = > fi . Name ) . ToList ( ) ;
}
public static IList < string > GetDisplayValues ( Enum value )
{
return GetNames ( value ) . Select ( obj = > GetDisplayValue ( Parse ( obj ) ) ) . ToList ( ) ;
}
private static string LookupResource ( Type resourceManagerProvider , string resourceKey )
{
foreach ( var staticProperty in resourceManagerProvider . GetProperties ( BindingFlags . Static | BindingFlags . NonPublic | BindingFlags . Public ) )
{
if ( staticProperty . PropertyType = = typeof ( System . Resources . ResourceManager ) )
{
System . Resources . ResourceManager resourceManager = ( System . Resources . ResourceManager ) staticProperty . GetValue ( null , null ) ;
return resourceManager . GetString ( resourceKey ) ;
}
}
return resourceKey ; // Fallback with the key name
}
public static string GetDisplayValue ( T value )
{
var fieldInfo = value . GetType ( ) . GetField ( value . ToString ( ) ) ;
var descriptionAttributes = fieldInfo . GetCustomAttributes (
typeof ( DisplayAttribute ) , false ) as DisplayAttribute [ ] ;
if ( descriptionAttributes [ 0 ] . ResourceType ! = null )
return LookupResource ( descriptionAttributes [ 0 ] . ResourceType , descriptionAttributes [ 0 ] . Name ) ;
if ( descriptionAttributes = = null ) return string . Empty ;
return ( descriptionAttributes . Length > 0 ) ? descriptionAttributes [ 0 ] . Name : value . ToString ( ) ;
}
public static T GetValueFromName ( string name )
{
var type = typeof ( T ) ;
if ( ! type . IsEnum ) throw new InvalidOperationException ( ) ;
foreach ( var field in type . GetFields ( ) )
{
var attribute = Attribute . GetCustomAttribute ( field ,
typeof ( DisplayAttribute ) ) as DisplayAttribute ;
if ( attribute ! = null )
{
if ( attribute . Name = = name )
{
return ( T ) field . GetValue ( null ) ;
}
}
else
{
if ( field . Name = = name )
return ( T ) field . GetValue ( null ) ;
}
}
throw new ArgumentOutOfRangeException ( nameof ( name ) ) ;
}
public static int All ( )
{
return Enum . GetValues ( typeof ( T ) ) . Cast < int > ( ) . Sum ( ) ;
}
}
}