2012-09-06 34 views
6

Deserializing cây biểu thức bằng cách sử dụng ExpressionSerialization trên biểu thức điều kiện đầy đủ mà toán tử ternary đưa ra lỗi. Nếu tôi đang sử dụng nhà điều hành ternary nó gây ra FullConditionExpression (Hệ thống Not Supported Exception)Xây dựng các cây biểu thức để đại diện cho if-else

Sử dụng mã từ các liên kết sau đây:

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

Có bất kỳ phiên bản mới nhất có sẵn cho các liên kết ở trên?

http://metalinq.codeplex.com/

Cố gắng này sau đó

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

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

Biểu hiện không hỗ trợ nếu - khối khác. Nó cung cấp cho lỗi như "Một biểu thức lambda với một cơ thể tuyên bố không thể được chuyển đổi sang cây biểu thức Có cách nào khác để làm điều đó

+1

là x => "tiền mặt" quá đơn giản? – BlackBear

+0

Chỉ là đoạn mã của nó. Tôi muốn thực sự sử dụng nếu người khác - nếu người khác - nếu có. – StackOverflowVeryHelpful

Trả lời

5

Bạn có thể sử dụng một phương pháp giống như ở đây:..

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

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

+1, bạn xứng đáng với nó: P – BlackBear

3

Bạn phải sử dụng các nhà điều hành có điều kiện:..

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

Nó có thể là trình biên dịch được sửa đổi biểu thức vì gấp liên tục, tuy nhiên, vì điều kiện là một biểu thức hằng số (true) Hãy thử sử dụng một biến đó và xem những gì sẽ xảy ra

+0

True chỉ được sử dụng cho đoạn mã. Về cơ bản nó kiểm tra nhiều thứ để đánh giá đúng hoặc sai. Tôi cũng muốn thêm rằng tôi muốn sử dụng nếu else-if else-if else loop. – StackOverflowVeryHelpful

+0

@ user1650470 bạn không thể sử dụng if-else trong lambda biểu thức. Bạn có thể sử dụng toán tử điều kiện. Nếu bạn có nhiều điều kiện, sau đó sử dụng nhiều toán tử có điều kiện: 'x => condition1? result1: condition2? result2: condition3? result3: result4; '. Một lệnh lambda (chẳng hạn như 'x => {if (condition1) trả về kết quả1; không trả về kết quả2;}') không thể được chuyển đổi thành cây biểu thức. – phoog

0

Tôi tìm thấy giải pháp.

rao tôi đã sử dụng đoạn cụ thể này của mã

Sử dụng mã từ các liên kết sau đây:

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

Nó không xử lý đầy đủ biểu thức điều kiện nhưng nó xử lý biểu thức điều kiện. Tôi chỉ cần thêm FullConditionalExpression vào trường hợp chuyển đổi trong deserialization và nó làm việc. Nó giống như ConditionalExpression trong switch.

1

bạn có thể xây dựng một cây biểu hiện một cách rõ ràng với Expression API, hãy tham khảo https://msdn.microsoft.com/en-us/library/bb397951.aspx

đây là mã cho vấn đề của bạn:

 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); 
Các vấn đề liên quan