메서드 호출을 사용하면 람다에서 식으로 쉽게 이동할 수 있습니다.
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>>'
합니다. 명시 적 캐스트는 상황을 해결하지 않습니다. 내가 간과하고있는 이것을 할 수있는 시설이 있는가?
at lambda_method(Closure )
컴파일 된 델리게이트의 호출 과 같은 것을 보여주기 때문에 이것을 잃게됩니다 .