C# 在LINQ表达式中使用语句
我使用LINQ表达式树来生成动态代码 在该代码中,我需要使用如下语句将一些C# 在LINQ表达式中使用语句,c#,linq-expressions,C#,Linq Expressions,我使用LINQ表达式树来生成动态代码 在该代码中,我需要使用如下语句将一些BlockExpression包装成: using(GetLock()) { return ...SomeExpr...; } 没有表达式。使用,我不知道如何正确地为表达式创建变量。尝试最终创建如下代码 IDisposable disposable; try { disposable = GetLock(); // rest of using block } finally { if (disposabl
BlockExpression
包装成:
using(GetLock()) {
return ...SomeExpr...;
}
没有表达式。使用
,我不知道如何正确地为表达式创建变量。尝试最终创建如下代码
IDisposable disposable;
try
{
disposable = GetLock();
// rest of using block
}
finally
{
if (disposable != null)
disposable.Dispose();
}
下一个方法将创建该表达式
private static Expression<Action> CreateExpression<T>(Expression<Func<T>> getLock) where T : IDisposable
{
var disposableType = typeof(IDisposable);
var dispose = disposableType.GetMethod("Dispose");
if (dispose == null)
throw new InvalidOperationException();
var disposable = Expression.Variable(disposableType, "disposable");
var tryFinally = Expression.TryFinally(
Expression.Block(
Expression.Assign(disposable, Expression.Convert(Expression.Invoke(getLock), disposableType))
// rest of using block
),
Expression.IfThen(
Expression.NotEqual(disposable, Expression.Constant(null)),
Expression.Call(disposable, dispose)
)
);
var lambda = Expression.Lambda<Action>(
Expression.Block(
new []{disposable}, // variable
tryFinally // body
)
);
return lambda;
}
private静态表达式CreateExpression(表达式getLock),其中T:IDisposable
{
var可处置类型=类型(IDisposable);
var dispose=disposableType.GetMethod(“dispose”);
if(dispose==null)
抛出新的InvalidOperationException();
var disposable=表达式变量(disposableType,“disposable”);
var tryFinally=Expression.tryFinally(
表达式块(
Expression.Assign(一次性,Expression.Convert(Expression.Invoke(getLock),disposableType))
//剩余的使用块
),
表达方式(
Expression.NotEqual(一次性的,Expression.Constant(null)),
Expression.Call(一次性、处置)
)
);
var lambda=表达式.lambda(
表达式块(
新[]{disposable},//变量
尝试最终//身体
)
);
返回lambda;
}