C#利用反射让繁琐复杂的switch,case代码变得简洁

原代码如图:

看起来是大量重复代码,虽然看起来优雅,但是如果设置的值高达上百个那不是要写上百个嘛?此处来自上级导审阅我的代码后给出的想法,于是乎我对代码进行了二次重构

C#利用反射让繁琐复杂的switch,case代码变得简洁插图

switch (CurrentSysParameter.SysParameter_ID)
                    {
                        case SysParamIDs.RLUA_L3:
                            PopupControlNames.RLUA_L3 = PCSession.dictWorkDataSet[CurrentExtNo].GetSysParamValue<double>(SysParamIDs.RLUA_L3);
                            break;
                        case SysParamIDs.RLUB_L3:
                            PopupControlNames.RLUB_L3 = PCSession.dictWorkDataSet[CurrentExtNo].GetSysParamValue<double>(SysParamIDs.RLUB_L3);
                            break;
                        case SysParamIDs.RLUC_L3:
                            PopupControlNames.RLUC_L3 = PCSession.dictWorkDataSet[CurrentExtNo].GetSysParamValue<double>(SysParamIDs.RLUC_L3);
                            break;
                        case SysParamIDs.RLUD_L3:
                            PopupControlNames.RLUD_L3 = PCSession.dictWorkDataSet[CurrentExtNo].GetSysParamValue<double>(SysParamIDs.RLUD_L3);
                            break;
                        case SysParamIDs.CONA_L3:
                            PopupControlNames.CONA_L3 = PCSession.dictWorkDataSet[CurrentExtNo].GetSysParamValue<double>(SysParamIDs.CONA_L3);
                            break;
                        case SysParamIDs.CONB_L3:
                            PopupControlNames.CONB_L3 = PCSession.dictWorkDataSet[CurrentExtNo].GetSysParamValue<double>(SysParamIDs.CONB_L3);
                            break;
                        case SysParamIDs.CONC_L3:
                            PopupControlNames.CONC_L3 = PCSession.dictWorkDataSet[CurrentExtNo].GetSysParamValue<double>(SysParamIDs.CONC_L3);
                            break;
                        case SysParamIDs.COND_L3:
                            PopupControlNames.COND_L3 = PCSession.dictWorkDataSet[CurrentExtNo].GetSysParamValue<double>(SysParamIDs.COND_L3);
                            break;
                    }

改造后的代码:

如图:

C#利用反射让繁琐复杂的switch,case代码变得简洁插图1

// 获取静态类的类型对象
Type staticClassType = typeof(PopupControlNames);
// 获取属性的 FieldInfo 对象
FieldInfo field = staticClassType.GetField($"{CurrentSysParameter.Name}", BindingFlags.Public | BindingFlags.Static);
object value = PCSession.dictWorkDataSet[CurrentExtNo].GetType().GetMethod("GetSysParamValue").MakeGenericMethod(typeof(double)).Invoke(PCSession.dictWorkDataSet[CurrentExtNo], new object[] { CurrentSysParameter.SysParameter_ID });  //获取值
field.SetValue(null, value); //设置值

这里因为属性的值,刚好和选择的值是一致的,所以可以这样做。如果不一样的话,需要建立字典进行映射。具体这方面的方法可以查看C#映射使用之AutoMapper与映射的关系

相关推荐: C#利用反射让繁琐复杂的switch,case代码变得简洁

原代码如图:看起来是大量重复代码,虽然看起来优雅,但是如果设置的值高达上百个那不是要写上百个嘛?此处来自上级领导审阅我的代码后给出的想法,于是乎我对代码进行了二次重构switch (CurrentSysParameter.SysParameter_ID) { …

© 版权声明
THE END
喜欢就支持一下吧
点赞6 分享
评论 抢沙发
头像
欢迎您留下宝贵的见解!
提交
头像

昵称

取消
昵称表情代码图片

    暂无评论内容