首页 > 解决方案 > 在运行时从 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 != ""; 

标签: c#.netentity-frameworkdomainservices

解决方案


我建议使用 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;

推荐阅读