Codedom生成复杂的if语句

时间:2011-09-01 10:42:34

标签: c# code-generation codedom

我有点陷入困境,尝试生成一个复杂的if语句,如下面的那个

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

通过使用CodeConditionStatement类,我可以生成上面的第一个条件,但我似乎无法找到添加第二个条件的方法,特别是使用所需的括号以及如何在运行时进行评估的方式?

注意:我不想使用CodeSnippetExpression类。

有什么想法吗?

提前致谢。

3 个答案:

答案 0 :(得分:4)

将条件分成3个二进制表达式:(class1.Property == class2.Property || (class3.Property || class4.Property)

  1. class3.Property || class4.Property - 左侧和右侧CodePropertyReferenceExpression的CodeBinaryOperatorExpression
  2. class1.Property == class2.Property - 左侧和右侧CodePropertyReferenceExpression的CodeBinaryOperatorExpression
  3. 最后#2 || #1 - 左边的CodeBinaryOperatorExpression#2和右边的#1

答案 1 :(得分:1)

首先,一种简单的方法是声明一个布尔变量。 将其初始化为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
}

答案 2 :(得分:0)

简化为仅比较布尔值,但保留if,else ......

Toast mytoast;
mytoast = Toast.makeText(getApplicationContext(), "Hi Ho Jorgesys! ", Toast.LENGTH_LONG);
mytoast.show();
....
....
....
if(CancelToast){
  mytoast.cancel();
}

产生

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);