2013-07-04 3 views
2

두 개의 일반 메서드 중 하나를 void로 만들고 다른 메서드는 반환 형식을 사용하려고합니다. void 메서드는 Action 대리자를 사용하고 다른 하나는 Func 대리자를 사용합니다. 보이드 메소드의 구현은 다음과 같다 :대리자 매개 변수가있는 일반 메서드

public static void ExecuteVoid<T>(Action<T> actionToExecute) 
    { 
     string endpointUri = ServiceEndpoints.GetServiceEndpoint(typeof(T)); 

     using (ChannelFactory<T> factory = new ChannelFactory<T>(new BasicHttpBinding(), new EndpointAddress(endpointUri))) 
     { 
      T proxy = factory.CreateChannel(); 

      actionToExecute(proxy); 
     } 
    } 

이 잘 작동하지만 나는 void 이외의 방법으로 가진 문제 해요 : 나는에 전화를 걸 때 이제

public static T ExecuteAndReturn<T>(Func<T> delegateToExecute) 
    { 
     string endpointUri = ServiceEndpoints.GetServiceEndpoint(typeof(T)); 

     T valueToReturn; 

     using (ChannelFactory<T> factory = new ChannelFactory<T>(new BasicHttpBinding(), new EndpointAddress(endpointUri))) 
     { 
      T proxy = factory.CreateChannel(); 

      valueToReturn = delegateToExecute(); 
     } 

     return valueToReturn; 
    } 

을 이 같은 방법

The type arguments for method 'ServiceFactory.ExecuteAndReturn<T>(System.Func<T>)' cannot be inferred from the usage. Try specifying the type arguments explicitly. 
:

var result = ServiceFactory.ExecuteAndReturn((IMyService x) => x.Foo()); 

나는이 컴파일 오류가

Foo()object을 반환하는 인수가없는 메소드입니다.

var result = ServiceFactory.ExecuteAndReturn<IMyService>(x => x.Foo()); 

을하지만 지금은

Delegate 'IMyService' does not take 1 arguments. 

정말 여기에 잃었어요 말을 다른 예외를 받고 있어요 : 나는 다음 명시 적으로 유형을 지정하여 메소드를 호출했습니다. 어떤 도움을 주셔서 감사합니다.

+0

'위임'IMyService은 '1 개 인자를 고려하지 않습니다 " IMyService의 정의는 무엇입니까? –

+0

@terrybozzio이 경우'x'의 타입은 무엇입니까? 형식을 어떻게 든 지정해야합니다. – PoweredByOrange

답변

6

반환 유형을 프록시 유형과 혼동시킬 수 있습니다. 인수를 Func<T>으로 지정하면 T이 프록시 유형이 아닌 함수의 리턴 유형이어야합니다. 그러나 적절한 서비스 엔드 포인트와 채널 팩토리를 얻으려면 프록시 유형을 지정해야합니다. 따라서 두 개의 매개 변수가 실제로 필요합니다. 하나는 프록시 용이고 다른 하나는 반환 유형입니다. 또한 함수 대리자가 매개 변수로 초기화 된 프록시를 가져와야한다고 가정합니다. 그렇지 않으면이 래퍼 메서드는 무의미합니다.

public static TResult ExecuteAndReturn<TProxy, TResult>(
    Func<TProxy, TResult> delegateToExecute) 
{ 
    string endpointUri = ServiceEndpoints.GetServiceEndpoint(typeof(TProxy)); 

    TResult valueToReturn; 

    using (ChannelFactory<TProxy> factory = new ChannelFactory<TProxy>(new BasicHttpBinding(), new EndpointAddress(endpointUri))) 
    { 
     TProxy proxy = factory.CreateChannel(); 

     valueToReturn = delegateToExecute(proxy); 
    } 

    return valueToReturn; 
} 

편집는 : (IMyService x) => x.Foo()Func<T> 대표와 호환되지 않기 때문에 컴파일러 오류가 발생했다. 익명 함수를 작성할 때 추론 된 유형은 익명 함수 자체의 유형이며 추측 된 메서드는 아닙니다. 이 경우 익명 함수는 IMyService 유형의 단일 매개 변수를 허용하고 object (반환 유형은 Foo)을 반환합니다. 따라서이 익명 메서드에 대한 올바른 대리자는 Func<IMyService, object>입니다.

+1

물론 ... 좋은 변수 이름 주셔서 감사합니다! :) – PoweredByOrange

+1

저는 실제로이 래퍼 메서드와 비슷한 것을 이전에 작성 했으므로 친숙하다고 생각했습니다. ;-) – Douglas

0

당신은 매개 변수없이 func<x> 즉 대리인으로 당신의 인수를 정의했지만 다음 1 개 매개 변수를 Func<x,y> 즉 대리자로 호출하면, IMyService는, 따라서 오류

관련 문제