Codedom генерирует сложный оператор if - PullRequest
1 голос
/ 01 сентября 2011

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

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

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

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

Есть идеи?

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

Ответы [ 3 ]

4 голосов
/ 01 сентября 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 справа
1 голос
/ 01 сентября 2011

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

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
}
0 голосов
/ 02 июня 2015

Упрощено только для сравнения логических значений, но с сохранением if, иначе ...

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...";
}
...