这篇文章主要介绍了C# 枚举高级用法之Description,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
基础枚举
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.子类。 那。。。。。可发挥空间就大了。
到此这篇关于详解C# 枚举高级用法之Description的文章就介绍到这了,更多相关C# 枚举内容请搜索得得之家以前的文章希望大家以后多多支持得得之家!
沃梦达教程
本文标题为:详解C# 枚举高级用法之Description
猜你喜欢
- C# 通过连接字符串检索正确的 DbConnection 对象 2022-01-01
- Azure Active Directory 与 MVC,客户端和资源标识同一 2022-01-01
- 为什么 C# 中的堆栈大小正好是 1 MB? 2022-01-01
- 是否可以在 .Net 3.5 中进行通用控件? 2022-01-01
- 带问号的 nvarchar 列结果 2022-01-01
- 使用 rss + c# 2022-01-01
- Windows 喜欢在 LINUX 中使用 MONO 进行服务开发? 2022-01-01
- CanBeNull和ReSharper-将其用于异步任务? 2022-01-01
- 在 C# 中异步处理项目队列 2022-01-01
- 在 LINQ to SQL 中使用 contains() 2022-01-01