c# - 在运行时从 C# 中的条件字典验证实体属性
问题描述
我的申请中有以下要求。
我的实体名称是付款。付款时,我有以下条件。基于这些条件,我不得不说它是付款或恢复或现金。我在字典中定义了所有这些条件。
Dictionary<string, string> paymentTypes = new Dictionary<string, string>();
paymentTypes.Add("Cash", "Payment.Type = 'C' and Recovery != ''");
paymentTypes.Add("Recovery", "Payment.Recovery = ''");
paymentTypes.Add("Payment", "Payment.Recovery != ''");
在运行时如何使用字典检查支付对象的值?根据条件,我必须选择字典键。
我已经尝试了几种解析它们,或者它们不支持表达式中的字符串的数学解析器。
我无法将我的表达式转换为动态表达式。所有这些表达式都将来自 DB 作为字符串。当我的实体是通用的时,我应该如何定义表达式?这些是我做的表达。
Expression<Func<Payment, bool>> cashFilter = payment => payment.Recovery == "" && payment.Type != "V" && payment.Type != "S";
Expression<Func<Payment, bool>> paymentFilter = payment => payment.Recovery == "";
Expression<Func<Payment, bool>> recoveryFilter = payment => payment.Recovery != "";
解决方案
我建议使用 lambda 而不是字符串。
var paymentTypes = new Dictionary<string, Func<Payment,bool>>
{
{ "Cash", payment => payment.Type == 'C' && payment.Recovery != '' },
{ "Recovery", payment => payment.Recovery == '' },
{ "Payment", payment => payment.Type != 'C' && payment.Recovery != '' }
};
然后你可以像这样评估它:
var paymentType = paymentTypes.Single( entry => entry.Value(payment) ).Key;
推荐阅读
- tensorflow - TensorFlow 和 Keras 中的符号张量是什么?
- c# - 使用任务延迟后看不到输出
- scala - 为什么Scala Future在映射到迭代器时顺序运行
- java - 尝试根据列数据类型设置值时出现 NullPointerException
- java - 使用 Layout Inflater 方法为动态创建的 EditText 创建 TextView
- python - 整数列表中的最大距离
- drupal-8 - 文件从 Drupal 上传到 Box
- c# - 电流停止后如何更改视频?
- android - R8:不进行类型检查,将被假定为不可访问
- postgresql - flyway迁移后弹簧数据不计算SERIAL列的行数