我正在編寫一些代碼來幫助簡化表達式樹中的C#方法模式。在使用塊的情況下,有三種方法來使用它::有沒有辦法發現ParameterExpression是否被BlockExpression或LambdaExpression捕獲
using(var something=IDisposible_value) //1
using(something = IDisposible_value) //2
using(something) //3
現在我的代碼如下所示:
public static Expression GenerateUsingBoilerPlate(ParameterExpression disposible,Expression toAssign,Expression body)
{
ArgumentValidator.AssertIsNotNull(() => disposible);
ArgumentValidator.AssertIsNotNull(() => body);
var toDispose = Expression.Variable(typeof(IDisposable));
Expression retVal = Expression.TryFinally(
body,
Expression.Block(
new[] { toDispose },
Expression.Assign(
toDispose,
Expression.TypeAs(
disposible,
typeof(IDisposable)
)
),
Expression.IfThen(
Expression.NotEqual(
toDispose,
Expression.Default(
typeof(IDisposable)
)
),
Expression.Call(
toDispose,
"Dispose",
Type.EmptyTypes
)
)
)
);
if (toAssign != null)
{
retVal = Expression.Block(
new[] { disposible },
Expression.Assign(
disposible ,
toAssign
),
retVal
);
}
return retVal;
}
問題是這樣的代碼只能處理案件1情況3,因爲我無法知道disposible
變量是否已經綁定到表達式樹中的其他位置。任何人都可以提出一種方法來確定是否被綁定?
如果您處理案例2,您的代碼將會如何不同?看起來它已經是案例2. – Gabe 2010-10-25 14:47:57
現在我假設,如果你不使用參數'toAssign',那麼你的情況是3.如果你使用參數,你的情況是1.案例2會如果你使用了參數,會發生,但'disposible'已經綁定。 – 2010-10-25 14:50:40
你能舉一個你如何使用鍋爐板方法的例子嗎? – Les 2010-10-25 20:13:55