Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/276.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在LINQ表达式中使用语句_C#_Linq Expressions - Fatal编程技术网

C# 在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

我使用LINQ表达式树来生成动态代码

在该代码中,我需要使用如下语句将一些
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;
}