一网打尽枚举操作 .net core
本文介绍如何使用枚举以及,如何将枚举类型更好的应用于项目中,看完本文可以有序的将项目中的枚举更容易的使用到每个角落。
1,分析枚举
/// <summary>
/// 性别
/// </summary>
public enum Gender
{
/// <summary>
/// 男
/// </summary> Man = ,
/// <summary>
/// 女
/// </summary> Women =
}
如1所示,这是一个非常普通的枚举类,在项目中使用的话,一般都会将它作为某实体的一个属性,这个时候问题就来了,在页面里边我们是需要拿到与之相关的描述信息和对应的值作为一个下拉框或者checkbox让用户去选择,同时也不可以将Disable和enable作为给用户最终展示的信息,需要去手动去拼,于是有了如下的方式
2,枚举类信息完善,增加描述信息
/// <summary>
/// 性别
/// </summary>
public enum Gender
{
/// <summary>
/// 男
/// </summary>
[Description("男")]
Man = ,
/// <summary>
/// 女
/// </summary>
[Description("女")]
Women =
}
再给枚举增加一个扩展方法
/// <summary>
/// 获取到对应枚举的描述-没有描述信息,返回枚举值
/// </summary>
/// <param name="enum"></param>
/// <returns></returns>
public static string GetDescription(this Enum @enum)
{
Type type = @enum.GetType();
string name = Enum.GetName(type, @enum);
if (name == null)
{
return null;
}
FieldInfo field = type.GetField(name);
if (!(Attribute.GetCustomAttribute(field, typeof(DescriptionAttribute)) is DescriptionAttribute attribute))
{
return name;
}
return attribute?.Description;
}
好像到这一步的时候问题可以得到解决,通过getdescroption()这类的方法可以去获取到与枚举相应的描述信息用于展示,但是这也仅限于在mvc模式下,通过viewbag将枚举的类中的每一项都加到枚举集合中返回给页面,在页面里边遍历,如果枚举类型很多,那么这类型的重复逻辑就会很多,非常的心烦。
如果可以将这些操作做一个封装,用一个接口可以返回所有枚举类型的相关信息,就好了,于是有了如下的做法
1 创建一个描述枚举的类
public class EnumModel
{
/// <summary>
///枚举原始值
/// </summary>
public ValueType Source { get; set; }
/// <summary>
/// 描述信息
/// </summary>
public string Description { get; set; }
/// <summary>
/// value
/// </summary>
public int Value { get; set; }
}
2,写一个方法通过传递一个枚举类类型去得到List<EnumModel>
public static List<EnumModel> GetEnumListModels<T>()
{
var model = default(T);
FieldInfo[] fieldinfo = typeof(T).GetFields();
List<EnumModel> result = new List<EnumModel>();
foreach (FieldInfo field in fieldinfo)
{
EnumModel enumModel = new EnumModel();
if (!(Attribute.GetCustomAttribute(field, typeof(DescriptionAttribute)) is DescriptionAttribute attribute))
{
enumModel.Description = field.GetValue(model).ToString();
}
else
{
enumModel.Description = attribute.Description;
}
enumModel.Value = field.GetValue(model).GetHashCode();
enumModel.Source = field.GetValue(model) as ValueType;
if (field.GetValue(model).ToString() != "")
{
result.Add(enumModel);
} }
return result;
}
3,写一个接口,输入枚举的类的名称,调用2中的方法,得到具体的返回信息
[Route("[controller]/{name}")]
public IActionResult GetEnumList(string name)
{
Assembly assembly = Assembly.Load("Ftw");
Type t = assembly.GetType(string.Concat("Ftw.Enum.", name), throwOnError: false, ignoreCase: true);
if (t == null)
{
throw new ServiceException(string.Concat("请确保枚举[", name, "]在 Ftw.Enum 中定义"));
}
Type enumhelp = typeof(EnumHelper);
var obj = enumhelp.GetMethod("GetEnumListModels").MakeGenericMethod(t);
return Json(obj.Invoke(t, null));
}
解释一下:Ftw是类库的名称,Enum是Ftw类库下的一个文件夹,所有的枚举类都在Enum下边放着,EnumHelper是 2 中方法【GetEnumListModels】所在的类,通过反射程序集得到枚举类型,通过反射程序集将类型传入GetEnumListModels作为 T 最后执行方法的到list.
比如 Gender的调用,假如 GetEnumList所在的controller是EnumController,那么调用就是通过 Enum/Gender ,对于.net core, mvc .net core api这类项目这种方式是非常有帮助的。
一网打尽枚举操作 .net core的更多相关文章
- C# 集合已修改;可能无法执行枚举操作
在winform 项目时遇到: 集合已修改;可能无法执行枚举操作的问题 错误原因:当用foreach遍历Collection时,如果对Collection有Add或者Remove或其他类似操作都会有这 ...
- {"集合已修改;可能无法执行枚举操作。"}
无论是向集合中添加元素还是从集合中删除元素,都会导致集合内部的变化,特别是集合遍历器的变化.例如 List<,,,,}; foreach(int x in list) { list.Remove ...
- 错误记录--关于foreach,集合已修改;可能无法执行枚举操作
集合已修改,可能无法执行枚举操作.今天在使用foreach遍历的时候出现了这样的错误.查了一下,这个是使用foreach的典型的错误问题问题.foreach在遍历取数据的过程中,枚举器只允许读,不允许 ...
- C# 集合已修改 可能无法执行枚举操作 zz
今天编写程序时 修改了list集合 在foreach时报 “集合已修改:可能无法执行枚举操作.”错误. 首先想到的是没有锁定集合对象. 增加了 private readonly object sync ...
- Collection was modified; enumeration operation may not execute Dictionary 集合已修改;可能无法执行枚举操作
public void ForeachDic() { Dictionary dic = new Dictionary(); dic.Add("1", 10); dic.Add(&q ...
- C# DIctionary:集合已修改,可能无法执行枚举操作
C#中直接对集合Dictionary进行遍历并修改其中的值,会报错,如下代码就会报错:集合已修改;可能无法执行枚举操作.代码如下 public void ForeachDic() { Dictiona ...
- JAVA枚举操作(获取值,转map集合)
JAVA枚举相对来说比.NET的枚举功能强大,感觉就像是一种简化版的类对象,可以有构造方法,可以重载,可以继承接口等等,但不能继承类,JAVA枚举在实际开发中应用相当频繁,以下几个封装方法在实际开发中 ...
- 黄聪:C#使用能够foreach对hashtable、List遍历时“集合已修改;可能无法执行枚举操作。”错误
解决办法:使用for循环,而不是foreach循环 例如: ArrayList akeys=new ArrayList(_transmit_tb.Keys); ;p> -;p--) { _tra ...
- 【转载】[C#]枚举操作(从枚举中获取Description,根据Description获取枚举,将枚举转换为ArrayList)工具类
关键代码: using System; using System.Collections; using System.Collections.Generic; using System.Compone ...
随机推荐
- 【Redis】Hash常见应用场景 - 电商购物车
电商购物车 以用户id为key 商品id为field 商品数量为value 购物车操作 [key(用户id),field(商品id),value(数量)] 添加商品 -> hset cart: ...
- Pyqt5_QWidget
QWidget常用方法: Qwidget.size()#获得客户区的大小 QWidget.width().QWidget.height()#获得客户区的宽度与高度 #设置不可以变宽.高 QWidget ...
- 联通光猫管理员密码分析(HG220GS-U)
联通光猫管理员密码分析 联通光猫型号:HG220GS-U软件版本:E00L3.03 运营商一直在做光猫防破解,对抗升级还是比较快的,所有的分析结论都和版本绑定的,因为运营商或者路由器的开发商看到后可能 ...
- 解决2003 - 2003 - Can't connect to MySQL server on '127.0.0.1'(61 "Connection refused")
1)右击数据库选择编辑连接2) 3)重新输入密码即可
- java三个时间类常用法
1.System.currentTimeMillis(); 获取当前时间戳 System的获取时间戳的方法,只能获取不能进行其他的操作,简单的毫秒计算可以使用 2.Date(),Date( ...
- SpringCloud(一)- SpringCloud简介
唯能极于情,故能极于剑 有问题或错误请及时联系小编或关注小编公众号 “CodeCow”,小编一定及时回复和改正,期待和大家一起学习交流 一.SpringCloud 1.1.Cloud 是什么 ?: 官 ...
- 0511Object类和异常
Object类和异常 [要点] toString方法:将类中要打印的信息转换为自定义格式的打印内容 [返回的是当前对象对应的完整包名.类名@当前对象在内存空间首地址(十六进制)] equals方法 p ...
- 【深度学习】PyTorch之Squeeze()和Unsqueeze()
1. unsqueeze() 该函数用来增加某个维度.在PyTorch中维度是从0开始的. import torch a = torch.arange(0, 9) print(a) 结果: tenso ...
- AD17无法复制原理图到Word的解决方法
标题: 解决AD17无法复制原理图到WORD 作者: 梦幻之心星 347369787@QQ.com 标签: [AD, Word, 原理图] 目录: 软件 日期: 2019-3-17 目录 前提说明: ...
- windows下grunt的快速入门
1.认识grunt grunt是什么:他是一套前端自动化工具,是一个基于nodejs的命令行工具.(Grunt和Grunt插件是通过npm 安装并管理的,所以首先要安装nodejs). grunt ...