2017-12-23 6 views
1

에서 매개 변수를 로그에? 예, 당신이 할 수있는방법 다음 코드를 감안할 때 일반적인 기능

+0

짧은 대답 : 아니오 – rokkerboci

+3

답변 : 예. 이는 "aspect 지향 프레임 워크"를 통해 달성 할 수 있습니다. 이 솔루션에는 메서드의 특성 표시를 통한 코드 주입이 포함됩니다. 표현식 트리를 사용하는 또 다른 접근법 : (표현식 > 표현식)을 실행하고 입력 매개 변수를 추출하기 위해 직접 구문 분석하십시오. 이 솔루션은 외부 프레임 워크를 포함하지 않지만 모든 함수 호출을 완전히 포함하지는 않습니다. – eocron

+0

그들을 사용하는 함수 (즉, Foo 내부)에 로그합니까? –

답변

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