2016-01-13 19 views
3

我掙扎建立,如果條件爲真拋出異常的表現,如果它是假的,它應該返回一個值,但我總是得到ArgumentException如何創建一個表達式,它引發異常或返回基於條件的值?

var expr = 
    Expression.Condition(
     Expression.Equal(Expression.Constant(0), Expression.Constant(0)), 
     Expression.Throw(Expression.Constant(new DivideByZeroException())), 
     Expression.Constant(1)); 
var lambda = Expression.Lambda<Func<int>>(expr); 
var result = lambda.Compile()(); 

如果我把Expression.Empty()爲然後運行Condition的第三個參數,但如果條件爲假,我不會得到期望的結果。

+0

0總是等於0時,你總是會拋出一個異常 –

+0

@YuvalItzchakov我知道;-)這只是爲了簡單。真實的表達具有真正的價值。 – t3chb0t

+0

如果我們不知道你的真實表情,我們該如何幫忙? –

回答

4

這就行了。

var expr = 
    Expression.Block(
     Expression.IfThen(
      Expression.Equal(Expression.Constant(1), Expression.Constant(1)), 
      Expression.Throw(
       Expression.New(typeof(DivideByZeroException)) 
      ) 
     ), 
     Expression.Constant(1) 
    ); 
var lambda = Expression.Lambda<Func<int>>(expr); 
var result = lambda.Compile()(); 

Conditional更類似於三元運算符。所以你正在寫在C#更加等價於:

return (0 == 0) ? throw new DivideByZeroException() : 1; 

我改變了你的不斷例外動態創建一個,我假設是首選。

+0

Pefect。它的工作原理;-)謝謝你......我一直在搜索MSDN一個小時,並沒有看到「If」......但是即使我發現它的「Block」表達式也是神奇的。 – t3chb0t

+0

我從[this]升級null-reference-visitor(http://stackoverflow.com/questions/30488022/how-to-use-expression-tree-to-safely-access-path-of-nullable-對象)的問題,可選地拋出'NullReferenceExeption's ...現在它確實; -D – t3chb0t

1

條件表達式必須從每個分支返回相同的類型。你試圖相當於

var x = 0==0 ? throw new DivideByZeroException() : 1; 

這是無效的。您可能只是原因一個DivideByZeroException

var expr = 
Expression.Condition(
    Expression.Equal(Expression.Constant(0), Expression.Constant(0)), 
    Expression.Divide(Expression.Constant(1), Expression.Constant(0)), 
    Expression.Constant(1)); 
+0

我想我選擇了錯誤的異常。它只是在那裏拋出其他的'NullReferenceExeption'或其他常見的東西。不管怎麼說,這個建議,不過不是我這次想要的;-) – t3chb0t

1

只需創建拋出你是例外,而且有你想要的任何類型的方法:

public static T ThrowHelper<T>(Exception e) 
{ 
    throw e; 
} 

然後,創建一個調用表達式該方法。這使得引發表達的表達,而不是語句的行爲,並允許表達有你想要的任何類型:

var throwMethod = typeof(TheClassThrowIsIn) 
    .GetMethod("ThrowHelper", BindingFlags.Static) 
    .MakeGenericMethod(typeof(int)); 
var expr = 
    Expression.Condition(
     Expression.Equal(Expression.Constant(0), Expression.Constant(0)), 
     Expression.Call(throwMethod, Expression.Constant(new DivideByZeroException())), 
     Expression.Constant(1)); 
相關問題