c# 枚举高级用法之
基础枚举
namespace TestEnum
{
//声明
public enum Name
{
//默认值 boob = 0 ,依次往下排,可自定义 jackMa = 3,jackCHan那就= 4
boob,
JackMa,
JackChan,
//
Lisa,
Poro
}
}
声明枚举,调用。
几个常用的转换不做介绍,一嗦一大堆。
- enum转string
- enum 转int
- string转enum
- 整型转enum
高级点用法,反射元数据
public enum Name
{
[Description("鲍勃")]
boob,
[Description("马宇")]
JackMa,
[Description("陈龙")]
JackChan,
[Description("丽莎")]
Lisa,
[Description("保罗")]
Poro
}
加了Description,就可以通过反射来访问这些数据
如何访问?
using System;
using System.ComponentModel;
namespace TestEnum
{
//基础枚举
public enum Name
{
[Description("鲍勃")]
boob,
[Description("马宇")]
JackMa,
[Description("陈龙")]
JackChan,
[Description("丽莎")]
Lisa,
[Description("保罗")]
Poro
}
//主要这个GetDescription()方法,看不懂没关系,如何调用
static class EnumExtensions
{
public static string GetDescription(this Enum val)
{
var field = val.GetType().GetField(val.ToString());
var customAttribute = Attribute.GetCustomAttribute(field, typeof(DescriptionAttribute));
return customAttribute == null ? val.ToString() : ((DescriptionAttribute)customAttribute).Description;
}
}
}
调用
string str = Name.boob.GetDescription();
//需要调用的地方调用
一个特性不够,能再加一个吗?
可以
加一个继承自Attribute 的类
public class DataTest : Attribute
{
public string Data { get; set; }
public DataTest(string data)
{
Data = data;
}
public DataTest(){}
}
加完了自定义特性后你就会发现可以加了。。
[Description("鲍勃")]
[DataTest("中文3级")]
boob,
[Description("马宇")]
[DataTest("中文2级")]
JackMa,
[Description("陈龙")]
[DataTest("中文1级")]
JackChan,
[Description("丽莎")]
[DataTest("中文2级")]
Lisa,
[Description("保罗")]
[DataTest("中文2级")]
Poro
就变成了这样
访问也得加一个
public static string GetData(this Enum val)
{
var field = val.GetType().GetField(val.ToString());
var customAttribute = Attribute.GetCustomAttribute(field, typeof(DataTest));
return customAttribute == null ? val.ToString() : ((DataTest)customAttribute).Data;
}
调用
string str = Name.boob.GetDescription();
string DStr = Name.boob.GetData();
以上就是enum 加+自定义特性
不够可以随时自己加。
可以测试玩玩,据说反射浪费资源。
完整代码
using System;
using System.ComponentModel;
namespace TestEnum
{
//基础枚举
public enum Name
{
[Description("鲍勃")]
[DataTest("中文3级")]
boob,
[Description("马宇")]
[DataTest("中文2级")]
JackMa,
[Description("陈龙")]
[DataTest("中文1级")]
JackChan,
[Description("丽莎")]
[DataTest("中文2级")]
Lisa,
[Description("保罗")]
[DataTest("中文2级")]
Poro
}
public class DataTest : Attribute
{
public string Data { get; set; }
public DataTest(string data)
{
Data = data;
}
public DataTest(){}
}
static class EnumExtensions
{
public static string GetDescription(this Enum val)
{
var field = val.GetType().GetField(val.ToString());
var customAttribute = Attribute.GetCustomAttribute(field, typeof(DescriptionAttribute));
return customAttribute == null ? val.ToString() : ((DescriptionAttribute)customAttribute).Description;
}
public static string GetData(this Enum val)
{
var field = val.GetType().GetField(val.ToString());
var customAttribute = Attribute.GetCustomAttribute(field, typeof(DataTest));
return customAttribute == null ? val.ToString() : ((DataTest)customAttribute).Data;
}
}
}
PS:可以声明obect类型Attribute.子类。 那。。。。。可发挥空间就大了。
————————————————
版权声明:本文为优快云博主「黄小月的爹地」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.youkuaiyun.com/huzi4152/article/details/110927862