Проверьте свойства объекта во время выполнения из словаря условий в С#.

У меня есть следующее требование в моем приложении.

Имя моей организации — «Платеж». При совершении Платежа у меня есть следующие условия. Исходя из этих условий, я должен сказать, что это оплата или восстановление или наличные деньги. Я определил все эти условия в словаре.

 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 != ''");

Как во время выполнения проверить значения объекта платежа с помощью словаря? Исходя из условия, я должен выбрать ключ словаря.

Я пробовал несколько синтаксических анализов, все из них или любой математический анализатор, который не поддерживает строку в выражениях.

Я не могу преобразовать свои выражения в динамическое выражение. Все эти выражения будут поступать из БД в виде строк. Как мне определить выражение, если моя сущность является универсальной? это выражения, которые я сделал.

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 != ""; 

person Suresh    schedule 02.04.2020    source источник
comment
Вы пытаетесь использовать это для фильтрации запросов Linq к БД? Если не совсем то, как вы просто их используете?   -  person juharr    schedule 02.04.2020
comment
Я определил эти правила (условия) в БД, я получу эти условия при загрузке моего приложения. В этом случае моей текущей сущностью является платеж, в некоторых других случаях это может быть платежная ведомость или сотрудник. Исходя из условия, я должен предпринять следующие действия. Я использую это в приложении Silverlight с инфраструктурой Entity.   -  person Suresh    schedule 02.04.2020


Ответы (1)


Я предлагаю использовать лямбда вместо строк.

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;
person John Wu    schedule 02.04.2020
comment
Поскольку OP помечен EF, я бы предложил вместо этого использовать Expression<Func<Payment,bool>>. - person juharr; 02.04.2020
comment
Если я определяю объект как Entity вместо объекта Payment, будет ли он работать так, чтобы его можно было применять к различным объектам во время выполнения? Я должен определить эти правила для всего моего приложения. На основании правил я должен предпринять некоторые действия. Эти правила настраиваются из БД в зависимости от потребностей клиента. - person Suresh; 02.04.2020
comment
Поскольку моя сущность является динамической, есть ли у меня выражение конструкции, как показано ниже в этом примере? stackoverflow.com/questions/8315819/ - person Suresh; 02.04.2020
comment
Я также имею в виду приведенные ниже ссылки. Я должен построить выражение. В моем запросе будут условия И и ИЛИ. Как мне сделать общее выражение и узнать имя моего действия из словаря? Sharp" title="множественные условия в лямбда-выражениях во время выполнения c Sharp">stackoverflow.com/questions/2486879/ stackoverflow.com/questions/31418069/ - person Suresh; 02.04.2020
comment
@Suresh Если вы хотите применить это к разным объектам с одинаковыми свойствами, я бы предложил использовать интерфейс. - person juharr; 02.04.2020
comment
@juharr, Entity является базовым классом для всех, поэтому я хочу использовать Entity. См. этот пример. stackoverflow.com/questions/7801165/ - person Suresh; 02.04.2020
comment
@Suresh Да, если у вас есть базовый класс, который определяет эти свойства, это тоже сработает. - person juharr; 02.04.2020