一网打尽枚举操作 .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 ...
随机推荐
- Tomcat——启动报错:Failed to start component [StandardEngine[Catalina].StandardHost[localhost].StandardContext[/Servlet_app02a]]
java.util.concurrent.ExecutionException: org.apache.catalina.LifecycleException: Failed to start com ...
- 关于mobileSelect.js日期数据获取封装,动态时间,封装
传入起始年份和起始月份 得到 插件的标准格式放到 效果 let getAllDatas = (stime, etime) => { //接收传进来的参数月份 var data_M = etime ...
- Jumpserver-跳板机的搭建
Jumpserver堡垒机 一.Jumpserver堡垒机概述-部署Jumpserver运行环境 01 跳板机概述 跳板机就是一台服务器,开发或运维人员在维护过程中首先要统一登录到这台服务器,然后再登 ...
- Ant 的最完整build.xml(转)
Ant的概念 Make命令是一个项目管理工具,而Ant所实现功能与此类似.像make,gnumake和nmake这些编译工具都有一定的缺陷,但是Ant却克服了这些工具的缺陷.最初Ant开发者在开发跨平 ...
- Mysql面试的技术名词
面试的技术名词 面试一般会遇到一些名词,其实可能自己都知道其中的道理,但是因为没了解过,当时心里就一句WC,然后弱弱答一句:不好意思这个我只是听过,具体还没了解过: 回表 覆盖索引 最左前缀匹配 索引 ...
- 05 . 前端之BootStrap
BootStrap简介 Bootstrap是美国Twitter公司的设计师Mark Otto和Jacob Thornton合作基于HTML.CSS.JavaScript 开发的简洁.直观.强悍的前端开 ...
- (Java实现) N皇后问题
n皇后问题是一个以国际象棋为背景的问题:在n×n的国际象棋棋盘上放置n个皇后,使得任何一个皇后都无法直接吃掉其他的皇后,即任意两个皇后都不能处于同一条横行.纵行或斜线上. 蛮力法思想: 解决n皇后问题 ...
- Java实现 LeetCode 491递增子序列
491. 递增子序列 给定一个整型数组, 你的任务是找到所有该数组的递增子序列,递增子序列的长度至少是2. 示例: 输入: [4, 6, 7, 7] 输出: [[4, 6], [4, 7], [4, ...
- Java实现 LeetCode 459 重复的子字符串
459. 重复的子字符串 给定一个非空的字符串,判断它是否可以由它的一个子串重复多次构成.给定的字符串只含有小写英文字母,并且长度不超过10000. 示例 1: 输入: "abab" ...
- Java实现P2102 -- 正整数序列
P2102 – 正整数序列 给定正整数n, 你的任务是用最少的操作次数把序列1,2,-,n中的所有数都变成0.每次操作可从序列中选择一个或多个整数, 同时减去一个相同的正整数.比如,1,2,3可以把2 ...