2012-05-24 2 views
1

나는 기능을 가지고 :패스 식 트리

public void Execute(Expression<Action> expression) 
{ 
    var time = expression.Compile().Benchmark(); 

    var msg = string.Format("{0} took {1} to complete", 
     ReflectionHelper.GetComponentCallDetails().ToString(), 
     time.ToString(@"hh\:mm\:ss\.ff")); 

    Logger.Info(msg); 
} 

호출 할 필요가 대리인은 뭔가 같은 :

channels = GetAllChannelsImpl(maxResults); 

내가 표현 나무에 비교적 새로운 오전 알아낼 수 없습니다 메서드에 Action 대리자를 전달하는 방법. 내가 오버 헤드를 사용할 필요를 제거하기 위해 식 트리 기반의 접근 방식을 사용하고 싶었

Execute(() => 
{ 
    channels = GetAllChannelsImpl(maxResults); 
}); 

그러나

나는

public void Execute(Action action) 
{ 
    var time = action.Benchmark(); 

    var msg = string.Format("{0} took {1} to complete", 
     ReflectionHelper.GetComponentCallDetails().ToString(), 
     time.ToString(@"hh\:mm\:ss\.ff")); 

    Logger.Info(msg); 
} 

를 사용하여 호출 동일한 기능을 수행 할 수 있었다 리플렉션을 호출하여 로그하기 위해 호출 된 메소드의 세부 사항을 찾습니다.

위의 작업 대리자에 대한 표현 트리를 메서드 매개 변수로 전달할 수있는 방법을 제안 할 수있는 사람이 누구나 있습니다.

+0

당신은'Execute()'메소드를 오버로딩했습니다 - 그래서 컴파일러는'Expression'을 가진 버전을'Expression '으로 preferes합니다. 이 경우가 아니라면 호출 구문은 동일 할 수 있습니다. '새로운 표현식 (() => // 등)'을 시도해 보셨습니까? 그것은 간단해야합니다. – Jonno

답변

2

람다 식 자체는 유형이 없습니다. 실제 유형은 할당 또는 캐스트하려는 대상에 따라 컴파일러에서 유추됩니다. 그렇게 말하면 간단한 λ를 사용하여 Execute() 메서드를 호출 할 때 람다가 Action 또는 Expression<Action>과 호환 될 수 있기 때문에 모호합니다. 예상 한 유형으로 명시 적으로 캐스팅하여이를 명확하게해야합니다.

// assign to a variable 
Expression<Action> action1 =() => ...; 
Execute(action1); 

// cast 
Execute((Expression<Action>)(() => ...)); 

// use the constructor 
Execute(new Expression<Action>(() => ...)); 

모호한 오버로드를 제거하고 메소드 중 하나의 이름을 바꾸는 것이 좋습니다. 표현 과부하의 이름을 ExecuteExpression()으로 바꾸는 것이 좋습니다.