一网打尽枚举操作 .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 ...
随机推荐
- 排序算法的总结——Java实现
前言 简单归纳一下最近学习的排序算法,如果有什么错误的地方还请大家指教. 本文介绍了七种经典排序算法,包括冒泡排序,选择排序,插入排序,希尔排序,归并排序,快速排序以及堆排序,并且讨论了各种算法的进一 ...
- LightOJ1220
题目链接:http://www.lightoj.com/volume_showproblem.php?problem=1220 题目大意: 给你一个 x,请求出一个最大的 p 使得 np = x(n为 ...
- python字典详细介绍
字典的用途 字典是Python提供的一种常用的数据结构,它用于存放具有映射关系的数据. 字典相当于保存了两组数据,其中一组数据是关键数据,被称为 key:另一组数据可通过 key 来访问,被称为 ...
- 使用 IdentityService4 集成小程序登录一种尝试
1 场景介绍 主要业务是通过 App 承载,在 App 中可以注册和登录,为了更好的发展业务引入了微信小程序,于是如何让这两个入口的用户互通便成了需要解决的问题. 看了一下其它 App 大致地思路是两 ...
- rancher证书过期
背景 无法打开rancher服务,报错如下截图,可以看出是证书过期了无法连上k8s,注意这里的证书是rancher自身证书并非k8s证书. 解决方法 rancher升级:https://rancher ...
- 附件2:async/await
在实际开发中总会遇到许多异步的问题,最常见的场景便是接口请求之后一定要等一段时间才能得到结果,如果遇到多个接口前后依赖,那么问题就变得复杂.大家都一直在尝试使用更好的方案来解决这些问题.最开始只能利用 ...
- 使用PInvoke互操作,让C#和C++愉快的交互优势互补
一:背景 1. 讲故事 如果你常翻看FCL的源码,你会发现这里面有不少方法借助了C/C++的力量让C#更快更强悍,如下所示: [DllImport("QCall", CharSet ...
- 第三篇-用Flutter手撸一个抖音国内版,看看有多炫
前言 前一篇已经开发了大部分框架,包含视频上下滑动播放,这次将上次未完成的数据显示友好显示,以及底部音乐走马灯特效,另外优化了加载数据的bug,在dart语言里 & 会自动变成& 另 ...
- [工具推荐]005.Axure RP Pro 7.0模拟C#TAB控件
有一次,主管安排我写一个项目的原型,但是项目中涉及到了Tab控件,在Axure中的控件中找了一番,没有找着Tab控件.那么我们只能换种法子来实现它了,我们用到了Dynamic Panel来模拟. 1. ...
- 如何看待 HashiCorp 官宣,不允许中国境内使用其旗下产品?
欢迎转载,欢迎看官推荐. 前言 HashiCorp 官方宣布,不允许中国境内使用.部署和安装该企业旗下的企业版产品和软件.该公司比较知名的产品有:Terraform.Consul.Vagrant 等. ...