Codedom генерирует сложный оператор if

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

if (class1.Property == class2.Property || (class3.Property && class4.Property))
{
  //do something
}
else
{
   //do something else
}

Используя класс CodeConditionStatement, я могу сгенерировать первое условие выше, но я не могу найти способ добавить второе условие, особенно с необходимыми скобками и способом, который будет оцениваться во время выполнения?

Примечание. Я не хочу использовать класс CodeSnippetExpression.

Любые идеи?

Заранее спасибо.


person Jon    schedule 01.09.2011    source источник
comment
Внутренние скобки в опубликованном примере бесполезны, потому что результат одинаков с ними или без них (даже порядок их оценки должен быть одинаковым)!   -  person Christoph Fink    schedule 01.09.2011
comment
... хотя это помогает визуализировать дерево выражений, которое может представлять условие   -  person George Duckett    schedule 01.09.2011
comment
изменяет логическую логику примера кода, чтобы нужны были скобки   -  person Jon    schedule 01.09.2011


Ответы (3)


Во-первых, самым простым способом было бы объявить логическую переменную. Инициализируйте его значением false и последовательностью, если вы манипулируете этой переменной. Не беспокойтесь о производительности или удобочитаемости, иногда это более удобочитаемо.

bool x = false;
if (class1.Property == class2.Property)
{
    x = true;
}
if (class3.Property == class4.Property)
{
    x = true;
}

if (!anotherthingtocheck)
    x = false;

if (x)
{
    // Do something
}
else
{
    // Do something else
}
person Salvatore Previti    schedule 01.09.2011

Разделите условие на 3 бинарных выражения: (class1.Property == class2.Property || (class3.Property || class4.Property)

  1. class3.Property || class4.Property — CodeBinaryOperatorExpression с CodePropertyReferenceExpression слева и справа
  2. class1.Property == class2.Property — CodeBinaryOperatorExpression с CodePropertyReferenceExpression слева и справа
  3. Наконец, #2 || #1 — CodeBinaryOperatorExpression №2 слева и №1 справа
person jfs    schedule 01.09.2011

Упрощено, чтобы просто сравнивать логические значения, но сохраняя if, else...

CodeEntryPointMethod start = new CodeEntryPointMethod();
//...
start.Statements.Add(new CodeVariableDeclarationStatement(typeof(bool), "ifCheck", new CodePrimitiveExpression(false)));
var e1 = new CodeBinaryOperatorExpression(new CodePrimitiveExpression(false), CodeBinaryOperatorType.IdentityEquality, new CodePrimitiveExpression(false));
var e2 = new CodeBinaryOperatorExpression(new CodePrimitiveExpression(false), CodeBinaryOperatorType.IdentityEquality, new CodePrimitiveExpression(true));
var ifAssign = new CodeAssignStatement(new CodeVariableReferenceExpression("ifCheck"), new CodeBinaryOperatorExpression(e1, CodeBinaryOperatorType.BooleanOr, e2));
start.Statements.Add(ifAssign);
var x1 = new CodeVariableDeclarationStatement(typeof(string), "x1", new CodePrimitiveExpression("Anything here..."));
var ifCheck = new CodeConditionStatement(new CodeVariableReferenceExpression("ifCheck"), new CodeStatement[] { x1 }, new CodeStatement[] { x1 });
start.Statements.Add(ifCheck);

генерирует:

bool ifCheck = false;
ifCheck = ((false == false) 
    || (false == true));
if (ifCheck) {
    string x1 = "Anything here...";
}
else {
    string x1 = "Anything here...";
}
person tic    schedule 02.06.2015