2011-09-01 64 views
1

我有点坚持尝试生成一个复杂的,如果像下面CodeDom中产生复杂的if语句

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

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

注意:我不想使用CodeSnippetExpression类。

任何想法?

在此先感谢。

+0

内部支架是在贴例子没用,因为结果是相同或不相同(即使它评估的顺序应该是相同的)! – ChrFin

+0

...虽然它确实帮助可视化表示条件的表达式树 –

+0

将代码示例的布尔逻辑更改为需要括号 – Jon

回答

1

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

独立的条件为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在右边
0

简化到只是比较布尔值,但如果保留了,否则......

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