Action
대신 Expression
을 전달해야합니다. 나무가 어떻게 생겼는지 이해하면 실제로 표현식 트리를 사용하는 것은 그리 어렵지 않습니다. ON (왼쪽 c
) 하나 개의 파라미터를 포함
(MyClass c) => c.TestMethod();
람다 식 (전체 블록) 등으로 세분화 될 수 있고, 및 본체 (c.TestMethod()
:
코드 줄 우편).
"본문"은 특정 개체 (매개 변수 인 c
), 실제 메서드 (TestMethod
) 및 인수 집합 (이 경우에는 없습니다)에 대한 메서드 호출입니다.
시각 :
LambdaExpression [ (MyClass c) => c.TestMethod() ]
/ \
/ \
/ \
Parameters Body [ MethodCallExpression: c.TestMethod() ]
| / \
| / \
1: MyClass c Object [c] \
/\
/\
/ \
Method [TestMethod] Arguments [Empty]
당신이 원하는 것은 람다 식의 몸 안에, 메소드 호출 식 내부 메소드 이름입니다. 그래서이 얻을 수있는 코드는 다음과 같습니다 전달 된 Expression<Action<T>>
정품 메서드 호출 표현 인 경우
물론
static string GetInnerMethodName<T>(Expression<Action<T>> expr)
{
MethodCallExpression mce = expr.Body as MethodCallExpression;
return (mce != null) ? mce.Method.Name : null;
}
이에만 작동합니다; 이 메서드의 소비자는 기술적으로 어떤 표현식도 전달할 수 있습니다.이 경우 null
이 반환됩니다. 대신 예외를 던지거나, 기본값을 반환하거나, 적절하다고 생각되는 다른 동작을 수행하도록이 값을 조정할 수 있습니다.
이를 사용하는 특별한 작업을 수행 할 필요가 없습니다 - 그것은 원래의 메소드와 같은 사용의 :
string methodName = GetInnerMethodName<MyClass>(c => c.TestMethod());
대단히 감사합니다. =) –