1. 程式人生 > >列舉操作(從列舉中獲取Description,根據Description獲取列舉,將列舉轉換為ArrayList)工具

列舉操作(從列舉中獲取Description,根據Description獲取列舉,將列舉轉換為ArrayList)工具

using System;
using System.Collections;
using System.Collections.Generic;
using System.ComponentModel;
using System.Reflection;

namespace CSharpUtilHelpV2
{
  /// <summary>
  /// 基於.NET 2.0的列舉工具類
  /// </summary>
  public static class EnumToolV2
  {
    /// <summary>
    /// 從列舉中獲取Description
    /// 說明:
    /// 單元測試-->通過
    /// </summary>
    /// <param name="enumName">需要獲取列舉描述的列舉</param>
    /// <returns>描述內容</returns>
    public static string GetDescription(this Enum enumName)
    {
      string _description = string.Empty;
      FieldInfo _fieldInfo = enumName.GetType().GetField(enumName.ToString());
      DescriptionAttribute[] _attributes = _fieldInfo.GetDescriptAttr();
      if (_attributes != null && _attributes.Length > 0)
        _description = _attributes[0].Description;
      else
        _description = enumName.ToString();
      return _description;
    }
    /// <summary>
    /// 獲取欄位Description
    /// </summary>
    /// <param name="fieldInfo">FieldInfo</param>
    /// <returns>DescriptionAttribute[] </returns>
    public static DescriptionAttribute[] GetDescriptAttr(this FieldInfo fieldInfo)
    {
      if (fieldInfo != null)
      {
        return (DescriptionAttribute[])fieldInfo.GetCustomAttributes(typeof(DescriptionAttribute), false);
      }
      return null;
    }
    /// <summary>
    /// 根據Description獲取列舉
    /// 說明:
    /// 單元測試-->通過
    /// </summary>
    /// <typeparam name="T">列舉型別</typeparam>
    /// <param name="description">列舉描述</param>
    /// <returns>列舉</returns>
    public static T GetEnumName<T>(string description)
    {
      Type _type = typeof(T);
      foreach (FieldInfo field in _type.GetFields())
      {
        DescriptionAttribute[] _curDesc = field.GetDescriptAttr();
        if (_curDesc != null && _curDesc.Length > 0)
        {
          if (_curDesc[0].Description == description)
            return (T)field.GetValue(null);
        }
        else
        {
          if (field.Name == description)
            return (T)field.GetValue(null);
        }
      }
      throw new ArgumentException(string.Format("{0} 未能找到對應的列舉.", description), "Description");
    }
    /// <summary>
    /// 將列舉轉換為ArrayList
    /// 說明:
    /// 若不是列舉型別,則返回NULL
    /// 單元測試-->通過
    /// </summary>
    /// <param name="type">列舉型別</param>
    /// <returns>ArrayList</returns>
    public static ArrayList ToArrayList(this Type type)
    {
      if (type.IsEnum)
      {
        ArrayList _array = new ArrayList();
        Array _enumValues = Enum.GetValues(type);
        foreach (Enum value in _enumValues)
        {
          _array.Add(new KeyValuePair<Enum, string>(value, GetDescription(value)));
        }
        return _array;
      }
      return null;
    }
  }
}
單元測試程式碼:
using Microsoft.VisualStudio.TestTools.UnitTesting;
using System;
using System.Collections;
using System.Collections.Generic;
namespace CSharpUtilHelpV2.Test
{
  public enum TestEnum
  {
    [System.ComponentModel.Description("第一")]
    One,
    [System.ComponentModel.Description("第二")]
    Two,
    [System.ComponentModel.Description("第三")]
    Three,
    [System.ComponentModel.Description("第五")]
    Five,
    [System.ComponentModel.Description("全部")]
    All
  }
  [TestClass()]
  public class EnumToolV2Test
  {
    [TestMethod()]
    public void GetDescriptionTest()
    {
      string _actual = TestEnum.Five.GetDescription();
      string _expected = "第五";
      Assert.AreEqual(_expected, _actual);
    }

    [TestMethod()]
    public void GetEnumNameTest()
    {
      TestEnum _actual = EnumToolV2.GetEnumName<TestEnum>("第五");
      TestEnum _expected = TestEnum.Five;
      Assert.AreEqual<TestEnum>(_expected, _actual);
    }

    [TestMethod()]
    public void ToArrayListTest()
    {
      ArrayList _actual = EnumToolV2.ToArrayList(typeof(TestEnum));
      ArrayList _expected = new ArrayList(5);
      _expected.Add(new KeyValuePair<Enum, string>(TestEnum.One, "第一"));
      _expected.Add(new KeyValuePair<Enum, string>(TestEnum.Two, "第二"));
      _expected.Add(new KeyValuePair<Enum, string>(TestEnum.Three, "第三"));
      _expected.Add(new KeyValuePair<Enum, string>(TestEnum.Five, "第五"));
      _expected.Add(new KeyValuePair<Enum, string>(TestEnum.All, "全部"));
      CollectionAssert.AreEqual(_expected, _actual);

    }
  }
}