/// <summary>
/// 備注特性
/// </summary>
public class RemarkAttribute : Attribute
{
/// <summary>
/// 備注
/// </summary>
public string Remark { get; set; }
public RemarkAttribute(string remark)
{
this.Remark = remark;
}
}
/// <summary>
/// 枚舉擴展類
/// </summary>
public static class EnumExtension
{
/// <summary>
/// 獲取枚舉的備注信息
/// </summary>
/// <param name="em"></param>
/// <returns></returns>
public static string GetRemark(this Enum value)
{
FieldInfo fi = value.GetType().GetField(value.ToString());
if (fi == null)
{
return value.ToString();
}
object[] attributes = fi.GetCustomAttributes(typeof(RemarkAttribute), false);
if (attributes.Length > 0)
{
return ((RemarkAttribute)attributes[0]).Remark;
}
else
{
return value.ToString();
}
}
public static string GetEnumDescription(this Enum value)
{
FieldInfo fi = value.GetType().GetField(value.ToString());
DescriptionAttribute[] attributes = (DescriptionAttribute[])fi.GetCustomAttributes(typeof(DescriptionAttribute), false);
if (attributes.Length > 0)
{
return attributes[0].Description;
}
else
{
return value.ToString();
}
}
}
var aaa = UserType.Type1.GetRemark();
var aab = UserType.Type2.GetEnumDescription();
一、引言
枚舉為我看日常開發的可讀性提供的非常好的支持,但是有時我們需要得到枚舉值得描述信息或者是注釋(備注)信息
比如要獲得 TestEmun.aaa 屬性值得備注 AAA,比較不方便得到。
public enum TestEmun
{
/// AAA
aaa =1,
/// BBB
bbb =2,
/// CCC
ccc =3
}
如果要得到類似的效果,我們就需要修改一下代碼了,使用反射很容易得到這個結果。
二、定義特性
using System;
using System.Reflection;
namespace Lib.DataModel.SysEnum
{
/// <summary>
/// 備注特性
/// </summary>
public class RemarkAttribute : Attribute
{
private string m_remark;
public RemarkAttribute(string remark)
{
this.m_remark = remark;
}
/// <summary>
/// 備注
/// </summary>
public string Remark
{
get { return m_remark; }
set { m_remark = value; }
}
/// <summary>
/// 獲取枚舉的備注信息
/// </summary>
/// <param name="val">枚舉值</param>
/// <returns></returns>
public static string GetEnumRemark(Enum val)
{
Type type = val.GetType();
FieldInfo fd = type.GetField(val.ToString());
if (fd == null)
return string.Empty;
object[] attrs = fd.GetCustomAttributes(typeof(RemarkAttribute), false);
string name = string.Empty;
foreach (RemarkAttribute attr in attrs)
{
name = attr.Remark;
}
return name;
}
}
/// <summary>
/// 枚舉擴展類
/// </summary>
public static class EnumExtension
{
/// <summary>
/// 獲取枚舉的備注信息
/// </summary>
/// <param name="em"></param>
/// <returns></returns>
public static string GetRemark(this Enum em)
{
Type type = em.GetType();
FieldInfo fd = type.GetField(em.ToString());
if (fd == null)
return string.Empty;
object[] attrs = fd.GetCustomAttributes(typeof(RemarkAttribute), false);
string name = string.Empty;
foreach (RemarkAttribute attr in attrs)
{
name = attr.Remark;
}
return name;
}
}
}
三 、測試代碼
public class UnitTest
{
public enum TestEmun
{
[Remark("AAA")]
aaa,
[Remark("BBB")]
bbb,
[Remark("CCC")]
ccc
}
public void GetEnumName()
{
//需要引用 Lib.DataModel.SysEnum 命名空間才可以使用 擴展方法
string name = TestEmun.aaa.GetRemark();
/*
name 值為 AAA
*/
}
}
四、擴展
//獲取枚舉的所有屬性名稱
var fields = typeof(MyEnum).GetFields(BindingFlags.Static | BindingFlags.Public);
foreach (var fi in fields)
Console.WriteLine(fi.Name);
原文地址:http://blog.csdn.net/xxj_jing/article/details/8556780
文章列表