2018年剩明天一个工作日了,感觉今年做了很多东西,又感觉没做什么东西,主要指工作上。
很多个系统做着做着因为需求太复杂了,做不下去不想做了,人手不够真的好难自己一个人开发一个复杂的系统,也没啥时间在前端方面深入学习。
做一个计算绩效的系统,开始不知道怎么做,把数据库设计得很复杂,通用性又好差,很多奇怪的指标都实现不了。半年后知道了一个库DynamicExpresso,可以动态执行c#代码返回结果,如果绩效系统能用上这个就能支持好多绩效的指标了,于是就想重构这个系统了,可是最近需求比较急又没时间去重构,只好在旧系统上先改一下。
使用DynamicExpresso具体代码就是这样:
var dict = new Dictionary<string, decimal>();
dict.Add("a", 2.0m);
dict.Add("b", 0.3m);
dict.Add("c", 0.05m);
var formula = "0.2>=dict[\"b\"]?dict[\"a\"]*dict[\"c\"]:33";
var target = new Interpreter();
target=target.SetVariable("dict", dict);
var result = target.Eval<decimal>(formula);
C#可是执行的时候又报错了:没有为类型“System.Double”和“System.Decimal”定义二进制运算符 GreaterThanOrEqual。
开始没读懂什么意思,百度又百度不到。
后来发现可以添加这段代码把错误提示显示成英文:
if (Debugger.IsAttached)
CultureInfo.DefaultThreadCurrentUICulture = CultureInfo.GetCultureInfo("en-US");
C#这样显示的错误就是:The binary operator GreaterThanOrEqual is not defined for the types ‘System.Double’ and ‘System.Decimal’.
英文的错误就比较好搜索到解决方案了,原来是我的表达式中的“0.2>=dict[“b”]”里面的“>= ”左边是Double类型,右边是Decimal类型,执行时没有自动转换类型,所以就报错了改成这样就能执行通过了:
var formula = "0.2m>=dict[\"b\"]?dict[\"a\"]*dict[\"c\"]:33";
C#就是把0.2定义成Decimal类型,这样就可以使用“>=”进行运算了。
把错误信息用英文显示这句代码真的很有用,怕不记得就写篇日志记一下,以后可能还用得到。
好久没上博客写日志了,也没什么好写的,希望2019年生活越来越好,身体越来越健康。
是不是有头像呢这样