에서 매개 변수를 로그에? 예, 당신이 할 수있는방법 다음 코드를 감안할 때 일반적인 기능
1
A
답변
1
을 :
"1, 2, 푸 :"그래서 출력은 같은 것을 읽을 것입니다. 표현 트리 사용. 그러나 모든 경우 (LINQ와 같은 연쇄 된 호출 등)는 다루지 않습니다. 항상 그러한 경우를 포함하도록 배치 될 수 있지만,이 방법은 쓰레기의 거대한 더미가 될 것이다 :
푸 :
class Program { static void Main(string[] args) { int result = Execute(() => Foo(1, 2)); } public static int Foo(int x, int y) { return x + y; } public static T Execute<T>(Expression<Func<T>> function) { var call = function.Body as MethodCallExpression; var values = new List<object>(); var obj = call.Object == null ? null : Expression.Lambda(call.Object).Compile().DynamicInvoke(); foreach (var arg in call.Arguments) { var value = Expression.Lambda(arg).Compile().DynamicInvoke(); values.Add(value); } LogMethodCall(call.Method.Name, values); return (T)call.Method.Invoke(obj, values.ToArray()); } public static void LogMethodCall(string methodName, IEnumerable<object> args) { Console.WriteLine("{0}: {1}", methodName, string.Join(",",args.Select(x=> x.ToString()))); } }
그것은 인쇄됩니다 1,2
당신에게 이 예제에서 invokation의 출력과 객체를 기록 할 수도 있습니다.
+0
정말 도움이됩니다. 고마워요. 이런 식을 사용하여 스스로를 교육해야합니다. 실적에 대한 우려가 있습니까? 또는 컴파일러는 LINQ를 본질적으로 평가합니까? – maxmoore14
+0
성능이 좋지 않습니다. 그것을 다루거나 명시 적으로 로깅을 작성하십시오. – eocron
짧은 대답 : 아니오 – rokkerboci
답변 : 예. 이는 "aspect 지향 프레임 워크"를 통해 달성 할 수 있습니다. 이 솔루션에는 메서드의 특성 표시를 통한 코드 주입이 포함됩니다. 표현식 트리를 사용하는 또 다른 접근법 : (표현식 > 표현식)을 실행하고 입력 매개 변수를 추출하기 위해 직접 구문 분석하십시오. 이 솔루션은 외부 프레임 워크를 포함하지 않지만 모든 함수 호출을 완전히 포함하지는 않습니다. –
eocron
그들을 사용하는 함수 (즉, Foo 내부)에 로그합니까? –