/*
                   _ooOoo_
                  o8888888o
                  88" . "88
                  (| -_- |)
                  O\  =  /O
               ____/`---'\____
             .'  \\|     |//  `.
            /  \\|||  :  |||//  \
           /  _||||| -:- |||||-  \
           |   | \\\  -  /// |   |
           | \_|  ''\---/''  |   |
           \  .-\__  `-`  ___/-. /
         ___`. .'  /--.--\  `. . __
      ."" '<  `.___\_<|>_/___.'  >'"".
     | | :  `- \`.;`\ _ /`;.`/ - ` : | |
     \  \ `-.   \_ __\ /__ _/   .-` /  /
======`-.____`-.___\_____/___.-`____.-'======
                   `=---='
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
         佛祖保佑       永无BUG
*/
/************************************************************************************
* Copyright (c) 2014  All Rights Reserved. 
* CLR版本： 4.0.30319.35317 
* 创建人：  luoshupeng 
* 电子邮箱：luoshupeng@outlook.com 
* 创建时间：8/28/2014 3:26:47 PM 
* 描述： 用字符串来表示一个Enum的值
* ===================================================================== 
* 修改标记  
* 修改时间：8/28/2014 3:26:47 PM 
* 修改人： luoshupeng 
* 描述：   
************************************************************************************/

using System;
using System.Collections.Generic;
using System.Linq;
using System.Reflection;
using System.Text;
using System.Threading.Tasks;

namespace VSConverterLib
{
    [AttributeUsage(AttributeTargets.Field, AllowMultiple=true, Inherited=true)]
    public class StringValueAttribute : Attribute
    {
        public string StringValue { get; protected set; }

        public StringValueAttribute(string value)
        {
            //Initialize class
            this.StringValue = value;
        }
    }

    public static class StringValueExtension
    {
        public static string GetStringValue<T>(this T value, int index)
        {
            StringValueAttribute[] stringValueAttributes = GetStringValueAttributes<T>(value);
            if (stringValueAttributes.Length <= index)
            {
                return null;
            }
            return stringValueAttributes[index].StringValue;
        }

        public static string GetStringValue<T>(this T value)
        {
            return value.GetStringValue<T>(0);
        }

        public static int GetStringValueCount<T>(this T value)
        {
            StringValueAttribute[] stringValueAttributes = GetStringValueAttributes<T>(value);
            return stringValueAttributes.Length;
        }

        private static StringValueAttribute[] GetStringValueAttributes<T>(T value)
        {
            Type type = value.GetType();
            StringValueAttribute[] result;
            if (value is Enum)
            {
                FieldInfo field = type.GetField(value.ToString());
                result = field.GetCustomAttributes(typeof(StringValueAttribute), false) as StringValueAttribute[];
            }
            else
            {
                result = type.GetCustomAttributes(typeof(StringValueAttribute), false) as StringValueAttribute[];
            }
            return result;
        }
    }
}
