2012-09-06 17 views
6

Deserializowanie drzewa wyrażeń przy użyciu ExpressionSerialization na pełnym wyrażeniu warunkowym, np. Operator potrójny, powoduje błąd. Jeśli używam operatora potrójny powoduje FullConditionExpression (system nie Obsługiwane wyjątku)Tworzenie drzew wyrażeń do reprezentowania, jeśli w przeciwnym razie

użyciu kodu z poniższych linków:

http://archive.msdn.microsoft.com/exprserialization

Czy istnieje najnowsza wersja dostępna na powyższy link?

http://metalinq.codeplex.com/

Tried to potem

public Expression<Func<object, string>> LabelCriteria { get; set; } 

LabelCriteria = x => 
    { 
     if (true) 
      return "Cash"; 
     else  
      return " "; 
    } 

Expression nie obsługuje IF - innego bloku. To daje błąd jak "Wyrażenie lambda z ciałem oświadczenie nie mogą być zamieniane na drzewie wyrażenie jest jakiś inny sposób to zrobić

+1

Czy x => "gotówka" zbyt proste? – BlackBear

+0

To tylko fragment kodu. Chcę faktycznie użyć, jeśli jeszcze - jeśli jeszcze - jeśli jeszcze. – StackOverflowVeryHelpful

Odpowiedz

5

można użyć metody jak tutaj:..

string myFunction(Object obj){ 
    //here your if-else... 
} 

LabelCriteria = x => myFunction(x); 
+2

+1, zasłużyłeś na to: P – BlackBear

3

Musisz użyć operatora warunkowego..

LabelCriteria = x => true ? "Cash" : " "; 

może być tak, że kompilator modyfikuje ekspresję powodu ciągłego składania jednak, ponieważ warunek jest stałą wyrażenie (true) Spróbuj użyć tam zmienną i zobaczyć co się dzieje

+0

Prawda jest używana tylko w przypadku fragmentu kodu. Zasadniczo sprawdza wiele rzeczy, aby ocenić je jako prawdziwe lub fałszywe. Chciałem także dodać, że chcę użyć, jeśli jeszcze-jeśli-jeśli-else pętli. – StackOverflowVeryHelpful

+0

@ user1650470 nie można użyć, jeśli-else w wyrażeniu lambda. Możesz użyć operatora warunkowego. Jeśli masz wiele warunków, użyj wielu operatorów warunkowych: 'x => warunek1? result1: condition2? result2: condition3? result3: result4; '. Instrukcja lambda (np. 'X => {if (warunek1) zwraca wynik1; else zwraca wynik2;}') nie może zostać przekonwertowana na drzewo wyrażeń. – phoog

0

znalazłem rozwiązanie.

Ad używałem ten konkretny kawałek kodu

użyciu kodu z poniższych linków:

http://archive.msdn.microsoft.com/exprserialization

Nie obsługiwać pełny wyraz warunkową ale obsługiwać wyrażenia warunkowego. Właśnie dodałem FullConditionalExpression do przełącznika w deserializacji i działało. To samo co ConditionalExpression w przełączniku.

1

można skonstruować drzewa wyrażenie jednoznacznie z Expression API, patrz https://msdn.microsoft.com/en-us/library/bb397951.aspx

oto kod dla swojego problemu:

 ParameterExpression x = Expression.Parameter(typeof (object), "x"); 
     ConditionalExpression body = Expression.IfThenElse(
      Expression.Constant(true), 
      Expression.Constant("Cash"), 
      Expression.Constant(" ") 
      ); 

     LabelCriteria = Expression.Lambda<Func<object, string>>(body, x); 
Powiązane problemy