深圳网站建设公司那家好,微信平台开发技术,做网站用什么字体字号,公司做网站推广需要多少钱C# 通过枚举类型字符串#xff0c;反射到枚举上 通过类型字符串#xff0c;反射出任意类型枚举类型通过反射调用枚举GetTypeByName(EnumName) 为空#xff1f; 小结 通过类型字符串#xff0c;反射出任意类型
之前老顾写过一篇博客#xff0c;通过反射#xff0c;使用字… C# 通过枚举类型字符串反射到枚举上 通过类型字符串反射出任意类型枚举类型通过反射调用枚举GetTypeByName(EnumName) 为空 小结 通过类型字符串反射出任意类型
之前老顾写过一篇博客通过反射使用字符串可以反射出当前项目中所有可用的类型包括泛型类型。需要补课的小伙伴可以围观下老顾之前的文章《C# 根据typename字符串创建任意类型的对象含泛型》。
虽然老顾自己也说了使用这个方法一般都是自己掉坑里的选择不过确实有时候也会用到。
枚举类型
一般在自己开发的程序中针对于特定的有限数据我们一般会做出一个枚举类型来规范所有参与项目的小伙伴避免出现歧义或不规范内容。
比如一个订单状态根据业务流程我们可以分成几个阶段 提交未处理 已接收订单 待付款 已付款 待发货 正在配送 已配送完成 订单完成 等等这样的有限状态集合。 也比如说访问网络资源会返回一些状态码比如 200、404、401、500 之类的这些都是有限状态所以通常我们都可以用 Enum 来定义一个枚举集合规范一下数据。
这样的操作主要是为了避免有的小伙伴写做待付款有的小伙伴写做未付款还有的写作待支付。。。总之不用枚举规范的话天知道会出现多少相同意义的数据。 CSDN 文盲老顾的博客https://blog.csdn.net/superwfei 老顾的个人社区https://bbs.csdn.net/forums/bfba6c5031e64c13aa7c60eebe858a5f?category10003typeId3364713 通过反射调用枚举
大多数时候我们在使用枚举的时候都是明确知道其类型的所以我们通常是直接用 Enum.GetName(枚举类型,值) 的方式来获取对应的文本描述。
但是偶尔我们需要调用枚举的位置并不是我们手写的代码而是类似模版定义这样的内容比如现在老顾就有这么一个模板定义 404.enum.httpstate 404 是值enum 是调用枚举httpstate 是枚举类型
正常在程序里写的话那么就应该是这样了
Enum.GetName(httpstate,404)但是模版里的话。。。这个 httpstate 是可以解析了但如果有多个模版且枚举类型不一致呢
比如有这么个模板内容
html symbols: ^lt,enum,htmlsymbols^ ^trage,enum,htmlsymbols^ ^gt,enum,htmlsymbols^
http state: ^200.enum.httpstate^ ^403.enum.httpstate^ ^500.enum.httpstate^
bidstate: ^11.enum.trade^ ^91.enum.trade^ ^99.enum.trade^那么这里出现了三个枚举类型如果少的话不通过反射用程序一个一个分支或者 switch 一下也是可以的但是如果再出现新的类型那么还是很痛苦的经常需要改代码了。
所以我们还是通过反射来实现枚举调用。
GetTypeByName(EnumName) 为空
我们直接使用之前定义的通过类名字符串调用类的方法 GetTypeByName里面的参数给一个枚举类型。。。结果。。。没有能获取到枚举类型Type 返回的是 null
我连泛型都搞出来了你告诉我枚举不能用 foreach (Type st in ts){if (RegexExpand.IsMatch(st.FullName, \. RegexExpand.FormatRegExp(source) (?\d)?$)){return st;}}打开原来的代码在 RegexExpand.IsMatch 这一行老顾打了一个断点然后发现枚举Enum 的字符串类型。。。有点哭笑不得。 好么类的话FullName 就是 xxx.yyy.zzz 的方式泛型就是 xxx.yyy.zzzn 的方式结果枚举类型你给来了个 xxx.yyyzzz 的方式。。。。
所以修改起来也非常简单把刚才代码中的正则 “\.” 换成 “[\.]” 即可。
然后我们就可以正常的调用枚举处理内容了 try{Type t Common.GetTypeByName(枚举类型字符串);return Enum.GetName(t, int.Parse(枚举值));}catch (Exception ex){return ex.Message;}小结
好吧没什么可多总结的就是 FullName 的格式有点出乎预料也许还有其他形式的FullName。总之还是要多见识见识才好。
另外再补充一下直接把 RegexExpand 修改成 Regex 即可这是老顾自己定义的一个静态类继承并扩充了一下 Regex 罢了。
FormatRegExp 方法就是将字符串转成正则表达式类似 py 中的 re.escape public static string FormatRegExp(string str){return str.Replace(\\, \\).Replace((, \\().Replace(), \\)).Replace({, \\{).Replace(}, \\}).Replace([, \\[).Replace(], \\]).Replace(., \\.).Replace(, \\).Replace(-, \\-).Replace(^, \\^).Replace($, \\$).Replace(?, \\?).Replace(*, \\*).Replace(|, \\|);}
其实就是几个字符替换的事自己随便放到哪里都可以。