2012-02-23 2 views
4

좋아,이 질문의 제목이 의미가되기를 바랍니다. 내 응용 프로그램에서 특별한 InvokeMethod에 의해 호출되어야하는 몇 가지 방법이 있습니다. 지금이 순간, 그것은 다음과 같이 작동 Func 대리인의 더 나은 (일반적인) 선언

internal bool RemoteLogin(string password) 
{ 
    return (bool)InvokeMethod(new Func<string, bool>(Server.RemoteLogin), password);    
} 

internal string GetSessionId() 
{    
    return (string)InvokeMethod(new Func<string>(Server.GetSessionId));      
} 

public object InvokeMethod(Delegate method, params object[] args) 
{ 
    return method.DynamicInvoke(args); 
}  

매개 변수 (들)을 추가,> ... 나는 새로운 Func을을 < 통과해야 InvokeMethod를 호출하고도 적절한 형식으로 반환 값을 캐스팅하기 위해. 이를 수행하는 더 나은 (더 일반적인) 방법이 있습니까? 예를 들어 Generics 또는 Reflection을 사용하고 있습니까?

도움이 매우 감사합니다.

+2

왜 메소드를 직접 호출하지 않습니까? 왜 Delegate.DynamicInvoke를 여기에서 사용합니까? –

+2

위 예제에서 InvokeMethod 메서드는 단순화되었습니다. 내 애플 리케이션에서 로그, 모니터, 예외 처리 등의 호출 않습니다. – Mike

답변

3

을 반복적 인 대가를 치르면서 일정한 양의 강력한 타이핑을 실현할 수 있습니다.

public R InvokeMethod<T,R>(Func<T,R> method, T argument) 
{ 
    return method(argument); 
} 

public R InvokeMethod<T1,T2,R>(Func<T1,T2,R> method, T1 argument1, T2 argument2) 
{ 
    return method(argument1, argument2); 
} 

public R InvokeMethod<T1,T2,T3,R>(Func<T1,T2,T3,R> method, T1 argument1, T2 argument2, T3 argument3) 
{ 
    return method(argument1, argument2, argument3); 
} 

등등.

원본과 일치하지만 실제 매개 변수를 처리 할 필요가 전혀 없습니다. 이 스타일로 전화 한 후

public R InvokeMethod<R>(Func<R> method) 
{ 
    return method(); 
} 

과 : 당신의 InvokeMethod이 방법을 쓰기 시도

internal bool RemoteLogin(string password) 
{ 
    return InvokeMethod(() => Server.RemoteLogin(password)); 
} 

internal string GetSessionId() 
{    
    return InvokeMethod(() => Server.GetSessionId()); 
} 

이 방법, 당신은 람다 식으로 처리 매개 변수를두고 한 번만 InvokeMethod를 작성해야합니다.

+1

그게 내가 무엇을 찾고 있었는지! 귀하의 답변에 많은 감사드립니다. 또한 응답 한 다른 모든 사람들에게 많은 감사합니다. – Mike

1

저는 Reed에 동의합니다. 실제로 직접 메소드를 호출하고 중복 된 코드를 제거 할 수는 있지만, 이런 일을 할 때 강력한 타이핑을 원한다면 InvokeMethod 콜을 다시 작성하는 것은 매우 쉽습니다.

public static T InvokeMethod<T>(Delegate method, params object[] args) 
{ 
    return (T)method.DynamicInvoke(args); 
} 

그런 다음 위의 호출은된다 :

return InvokeMethod(new Func<string, bool>(Server.RemoteLogin), password); 

그리고 Boolean 반환 형식은 당신의 방법에 반환 형식에 의해 추정된다.

2

"위의 예제에서 InvokeMethod 메서드는 단순화되었으며 내 응용 프로그램에서는 호출에 대한 로그, 모니터, 예외 처리 등을 수행합니다."

이 의견이 있으면 내 제안은이를 다시 작성하는 것입니다. 대신이 같은 대리자를 호출하면 작업이과 같이, Func<T>을 만들 수 :

public T InvokeMethod<T>(Func<T> method) 
{ 
    // Add wrapper as needed 
    return method(); 
} 

당신이 매개 변수를 전달해야 할 때 다음 람다를 사용하여 호출 할 수 있습니다

internal bool RemoteLogin(string password) 
{ 
    return InvokeMethod(() => Server.RemoteLogin(password));    
} 

internal string GetSessionId() 
{    
    return InvokeMethod(Server.GetSessionId);      
} 
1
static T Invoke<T>(Func<T> method) 
{ 
    //Log here 
    return method(); 
} 

bool RemoteLogin(string password) 
{ 
    return Invoke(() => Server.RemoteLogin(password)); 
} 
1

추가 정보 : 메서드에 반환 값이없는 경우 (예 : "void Logout()") 다른 서명/매개 변수로 인해 메서드 이름이 같을 수 있습니다 -> InvokeMethod -) 작업 대리자를 사용할 수 있습니다.

public void InvokeMethod(Action method) 
{ 
    method(); 
}