枚舉適配器

最近作了一個國外的項目,最後要本地化爲西班牙文。在項目開發中遇到各類的枚舉操做,如綁定下拉框,傳值,枚舉名稱與值的轉換,本地化操做,
枚舉項過濾==,因而下決心幫團隊革了這個命,寫了以下萬能代碼,名曰枚舉適配器,各類操做一步到位。。。
暫且只記下代碼,沒有本着分享的目的,勿怪!


/*************************************************************************
*GUID:16dd25b6-22cd-4184-9ef7-652a3f341ca9  *CLR:4.0.30319.17929 *Machine:  USER-KVT0SIKF25 *Author:Hollson *Email:Hollson@QQ.com *Time:2014/2/14 15:01:45 *Code Caption: ***************************************************************************/ namespace NT.Core {     /// <summary>     /// 枚舉信息     /// </summary>     public struct EnumInfos     {         /// <summary>         /// 枚舉字段索引         /// </summary>         public int Index { getset; }         /// <summary>         /// 枚舉名稱         /// </summary>         public string Name { getset; }         /// <summary>         ///枚舉值         /// </summary>         public int Value { getset; }         /// <summary>         /// 枚舉特性信息         /// </summary>         public EnumAttribute EnumAttributeInfo { getset; }         /// <summary>         /// 本地化字符串         /// </summary>         public string LocalizedString { getset; }     } }


using System.ComponentModel;
 
/*************************************************************************
*GUID:16dd25b6-22cd-4184-9ef7-652a3f341ca9 
*CLR:4.0.30319.17929
*Machine:  USER-KVT0SIKF25
*Author:Hollson
*Email:Hollson@QQ.com
*Time:2014/2/14 15:01:45
*Code Caption:
***************************************************************************/
 
namespace NT.Core
{
    /// <summary>
    /// 枚舉特性
    /// </summary>
    public sealed class EnumAttribute : DescriptionAttribute
    {
        /// <summary>
        /// 資源名稱
        /// </summary>
        public string ResourceName { getset; }
        /// <summary>
        /// 自定義標識
        /// </summary>
        public string Flag { getset; }
        /// <summary>
        ///  枚舉項描述信息
        /// </summary>
        public new string Description { getset; }
    }
}
 
#if 枚舉格式
public enum Bug : int
{
    /// <summary>
    /// Index=0
    /// Name="Keywords"
    /// Value=11
    /// TranslatedResource="關鍵字"
    /// </summary>
    [EnumAttribute(ResourceName = "Bug1_Keywords", Description = "描述", Flag = "標識位")]
    Keywords = 11,
    /// <summary>
    /// 大小寫錯誤
    /// </summary>
    [EnumAttribute(ResourceName="Bug1_Csletter")]
    Csletter = 12,
    /// <summary>
    /// 網絡錯誤
    /// </summary>
    [EnumAttribute(ResourceName = "Bug2_NetError")]
    NetError = 21,
    /// <summary>
    /// 鏈接超時
    /// </summary>
    [EnumAttribute(ResourceName = "Bug2_Timeout")]
    Timeout = 22,
    /// <summary>
    /// 訪問受限
    /// </summary>
    [EnumAttribute(ResourceName = "Bug3_Limited")]
    Limited = 31,
}
#endif
 

using System;
using System.Reflection;
using System.Collections.Generic;
 
/*************************************************************************
*GUID:16dd25b6-22cd-4184-9ef7-652a3f341ca9 
*CLR:4.0.30319.17929
*Machine:  USER-KVT0SIKF25
*Author:Hollson
*Email:Hollson@QQ.com
*Time:2014/2/14 15:01:45
*Code Caption:
***************************************************************************/
 
namespace NT.Core
{
    /// <summary>
    /// 枚舉適配器,用於枚舉對象綁定,本地化翻譯等工做
    /// </summary>
    public class EnumAdapter<EnumType>
    {
        /// <summary>
        ///獲取枚舉名稱集合
        /// </summary>
        public string[] Names
        {
            get { return System.Enum.GetNames(typeof(EnumType)); }
        }
 
        /// <summary>
        /// 獲取枚舉信息(包括字段的索引、名稱、值、特性信息、本地化字符串)
        /// _若是未找到對應的本地化字符串,則顯示原字符串
        /// </summary>
        /// <param name="GetLocalizedStrByResourceName">
        /// 實現了從字典表獲取本地化字符信息的委託                                            
        /// e.g: StringResource.ResourceManager.GetString(resourceName) 
        /// </param>
        /// <returns></returns>
        public IList<EnumInfos> GetEnumInfos(Func<stringstring> GetLocalizedStrByResourceName = null)
        {
            if (typeof(EnumType).IsEnum)
            {
                List<EnumInfos> result = new List<EnumInfos>();
                string[] names = System.Enum.GetNames(typeof(EnumType));
                try
                {
                    int index = 0;
                    foreach (var name in names)
                    {
                        int value = (int)System.Enum.Parse(typeof(EnumType), name, true);
                        FieldInfo info = typeof(EnumType).GetField(name);
                        EnumAttribute[] attreibutes = info.GetCustomAttributes(typeof(EnumAttribute), falseas EnumAttribute[];
                        string localizedString = string.Empty;
                        EnumAttribute enumAttributeInfo = null;
                        if (attreibutes.Length > 0)
                        {
                            //sealed保證了attreibutes的長度爲0或1
                            string resourceName = string.IsNullOrEmpty(attreibutes[0].ResourceName) ?
                                name : attreibutes[0].ResourceName;
                            string localizedStr = GetLocalizedStrByResourceName != null ?
                                GetLocalizedStrByResourceName(resourceName) : string.Empty;
                            localizedString = string.IsNullOrEmpty(localizedStr) ?
                                resourceName : localizedStr;
                            string description = string.IsNullOrEmpty(attreibutes[0].Description) ?
                                string.Empty : attreibutes[0].Description;
                            string flag = string.IsNullOrEmpty(attreibutes[0].Flag) ?
                                string.Empty : attreibutes[0].Flag;
                            enumAttributeInfo = new EnumAttribute
                            {
                                ResourceName = resourceName,
                                Description = description,
                                Flag = flag
                            };
                        }
                        else
                        {
                            string localizedStr = GetLocalizedStrByResourceName != null ?
                                GetLocalizedStrByResourceName(name) : string.Empty;
                            localizedString = string.IsNullOrEmpty(localizedStr) ? name : localizedStr;
                        }
                        var infos = new EnumInfos()
                        {
                            Index = index++,
                            Name = name,
                            Value = value,
                            EnumAttributeInfo = enumAttributeInfo,
                            LocalizedString = localizedString
                        };
                        result.Add(infos);
                    }
                }
                catch (Exception)
                {
                    throw;
                }
                return result;
            }
            else
            {
                throw new Exception("Type error, please make sure your type is enum!");
            }
        }
    }
}
相關文章
相關標籤/搜索