最近作了一個國外的項目,最後要本地化爲西班牙文。在項目開發中遇到各類的枚舉操做,如綁定下拉框,傳值,枚舉名稱與值的轉換,本地化操做,
枚舉項過濾==,因而下決心幫團隊革了這個命,寫了以下萬能代碼,名曰枚舉適配器,各類操做一步到位。。。
暫且只記下代碼,沒有本着分享的目的,勿怪!
/*************************************************************************
*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 { get; set; }
/// <summary>
/// 枚舉名稱
/// </summary>
public string Name { get; set; }
/// <summary>
///枚舉值
/// </summary>
public int Value { get; set; }
/// <summary>
/// 枚舉特性信息
/// </summary>
public EnumAttribute EnumAttributeInfo { get; set; }
/// <summary>
/// 本地化字符串
/// </summary>
public string LocalizedString { get; set; }
}
}
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 { get; set; }
/// <summary>
/// 自定義標識
/// </summary>
public string Flag { get; set; }
/// <summary>
/// 枚舉項描述信息
/// </summary>
public new string Description { get; set; }
}
}
#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<string, string> 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), false) as 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!");
}
}
}
}