概述:Attribute用来描述类、属性、枚举等,可通过自定义的Attribute达到想要表述东西,通过反射获取这些表述。
下面使用了一个自定义的时间属性来描述定义的时间枚举,最后通过反射加载获取这些枚举的描述。
尴尬:date在这里被我写成了Data,不过不影响,主要学习思路就好。
1.首先定义一个Attribute,这个Attr是我们自定义的,他继承自Attribute类,在这个属性中,定义一个构造函数用于等会儿对枚举字段的描述,同时定义一个Name属性来显示枚举字段的描述。
[C#] 纯文本查看 复制代码 /// <summary>
/// 用于时间类型的属性
/// </summary>
public class TimeAttr : Attribute
{
/// <summary>
/// 时间属性的名称
/// </summary>
/// <param name="name">名称</param>
public TimeAttr(string name)
{
Name = name;
}
/// <summary>
/// 名称
/// </summary>
public string Name { get; private set; }
}
2.定义一个需要的时间枚举,并使用我们定义的Attr
[C#] 纯文本查看 复制代码 /// <summary>
/// 时间类型
/// </summary>
public enum TimeType
{
/// <summary>
/// 年
/// </summary>
[TimeAttr("年")]
Year,
/// <summary>
/// 月
/// </summary>
[TimeAttr("月")]
Month,
/// <summary>
/// 日
/// </summary>
[TimeAttr("日")]
Data,
/// <summary>
/// 时
/// </summary>
[TimeAttr("时")]
Hour,
/// <summary>
/// 分
/// </summary>
[TimeAttr("分")]
Minute,
/// <summary>
/// 秒
/// </summary>
[TimeAttr("秒")]
Second
}
3.通过反射来加载这些Attr,拿到我们需要的东西,微软MSDN对反射有详细说明,这里写了一个针对TimeType的反射
[C#] 纯文本查看 复制代码 /// <summary>
/// 反射类
/// </summary>
public class Reflect
{
/// <summary>
/// 取得TimeType的Name属性
/// </summary>
/// <param name="timeType">类型</param>
/// <returns>该枚举的属性说明</returns>
public static string GetTimeName(TimeType timeType)
{
//反射
Type type = typeof(TimeType);
//取得枚举字段
var field = type.GetField(timeType.ToString());
//取得该字段的TimeAttr属性
var attr = field.GetCustomAttributes(typeof(TimeAttr), true);
//取得值,有且只有一个
if (attr != null && attr.Length > 0)
return (attr.First() as TimeAttr).Name;
//无值
return null;
}
/// <summary>
/// 取得Time枚举的所有字段描述
/// </summary>
/// <returns>描述</returns>
public static List<string> GetTimeNames()
{
//集合
List<string> rel = new List<string>();
//反射
Type type = typeof(TimeType);
foreach (var item in type.GetEnumNames())
{
//取得各个字段的描述
rel.Add(GetTimeName((TimeType)Enum.Parse(type, item)));
}
//返回
return rel;
}
}
4.我们来获取这些反射的值看看效果
[C#] 纯文本查看 复制代码 //单个获取
Console.WriteLine("枚举字段Data的Attr:" + Reflect.GetTimeName(TimeType.Data));
//所有的字段Attr
foreach (var item in Reflect.GetTimeNames())
{
Console.WriteLine(item);
}
下面是输出结果:
枚举字段Data的Attr:日
年
月
日
时
分
秒
对枚举的Atrr的自定义就被我们拿到了,拿到这些数据之后就能做你想做的了。
总结:这种反射可支撑动态获取枚举的一些描述,你可以用在项目里面产生对枚举的下拉菜单,同时当你的需求发生变化时,增加了枚举的字段,但是UI不需要再做任何修改,可极大的提高程序的可扩展性。
|