【发布时间】:2010-10-20 13:04:06
【问题描述】:
使用方法调用很容易从 lambda 转换为表达式...
public void GimmeExpression(Expression<Func<T>> expression)
{
((MemberExpression)expression.Body).Member.Name; // "DoStuff"
}
public void SomewhereElse()
{
GimmeExpression(() => thing.DoStuff());
}
但我想将 Func 转换为表达式,仅在极少数情况下...
public void ContainTheDanger(Func<T> dangerousCall)
{
try
{
dangerousCall();
}
catch (Exception e)
{
// This next line does not work...
Expression<Func<T>> DangerousExpression = dangerousCall;
var nameOfDanger =
((MemberExpression)dangerousCall.Body).Member.Name;
throw new DangerContainer(
"Danger manifested while " + nameOfDanger, e);
}
}
public void SomewhereElse()
{
ContainTheDanger(() => thing.CrossTheStreams());
}
不起作用的行给了我编译时错误Cannot implicitly convert type 'System.Func<T>' to 'System.Linq.Expressions.Expression<System.Func<T>>'。显式强制转换并不能解决这种情况。有没有我忽略的设施可以做到这一点?
【问题讨论】:
-
我认为“罕见情况”示例并没有多大用处。调用者传入 Func
。无需向调用者重复 Func 是什么(通过异常)。 -
异常不在调用者中处理。而且,由于有多个调用站点在不同的 Func
中传递,因此在调用者中捕获异常会产生重复。 -
异常堆栈跟踪旨在显示此信息。如果在 Func
的调用中抛出异常,这将显示在堆栈跟踪中。顺便说一句,如果您选择另一种方式,即接受一个表达式并编译它以供调用,您将失去它,因为堆栈跟踪会显示类似 at lambda_method(Closure )的内容来调用已编译的委托。 -
我想你应该看看这个 [link][1] [1] 中的答案:stackoverflow.com/questions/9377635/create-expression-from-func/…
标签: c# .net lambda expression func