2010-06-01 6 views
2

나는 코드에 여러 번 표시되는 recuring 메서드를 사용하여 기본적으로 odbc 연결이 정상인지 확인한 다음이 메서드를 호출 할 때마다 호출합니다 그것은 또 다른 메소드를 호출하고, 메인 메소드의 각 인스턴스는 서로 다르다. 각각의 메소드는 약 8 라인의 코드로 8 번 이상 코드에서 이상적이다.메서드의 인수로 C# 메서드 이름 전달 메서드

기본적으로 나는 새로운 메소드의 이름을 인수로 전달할 수있는 하나의 메소드 만 갖고 싶습니다.

그래서 기본적으로 같은 :

private void doSomething(methodToBeCalled) { if(somthingistrue) { methodToBeCalled(someArgument) } }

이 가능합니까? 사전

답변

3

당신은 위임을 사용할 수있는

덕분에,이 함수에 대한 포인터처럼 많이, 당신은 매개 변수를 호출하는 방법에 대리자를 전달할 수 있습니다. 귀하의 경우에는

public delegate void Del(string message); 
// Create a method for a delegate. 
public static void DelegateMethod(string message) 
{ 
    System.Console.WriteLine(message); 
} 
// Instantiate the delegate. 
Del handler = DelegateMethod; 

// Call the delegate. 
handler("Hello World"); 

private void doSomething(Del methodToBeCalled) 
{ 
    if(somthingistrue) 
    { 
     methodToBeCalled(someArgument) 
    } 
} 

이 가능할까요?

Delegates

+5

사용자 지정 대리자 형식을 정의하는 대신 BCL에서 발견 된'Action '대리자를 사용하는 것이 좋습니다. 유지할 물건이 줄어든다. –

+1

예, 이것은 좋은 지적입니다. 예외를 던지기와 마찬가지로 커스텀 구현보다는 프레임 워크에서 이미 완료된 것을 모두 사용하십시오. 많은 사람들이 맞춤 예외를 생성하기를 좋아합니다. –

0

사용하여 메소드의 인수로 대표하고 당신은 당신이 당신의 대리인이 서명에 충실 제공, 어떤 방법 당신이 원하는 할 수있는 대리자를 가리킬 수 있습니다.

0

리플렉션을 사용할 수도 있습니다. 어떤 것을 사용하는 것이 더 낫습니다 (반영 대 대리자)는 나머지 코드에 따라 다릅니다. 동일한 매개 변수를 사용하는 메서드를 항상 호출하는 경우에는 대리자가 가장 적합 할 것입니다. 다른 매개 변수를 사용하는 메서드를 호출해야하는 경우에는 리플렉션을 사용해야 할 것입니다. 귀하의 질문을 보면, 그것은 당신의 메소드가 매개 변수를 사용하지 않는 것처럼 보이기 때문에, 앞서 언급 한 것처럼 위임자를 사용합니다.

+1

반드시 반영 할 필요는 없습니다. 인수를 사용하여 함수를 호출합니다.이 제한 사항을 해결할 수 있습니다 (예 : 람다 함수 - 예를 들어 내 대답을 참조하십시오. – stakx

8

으로 이미이에 대한 위임을 사용할 수 있습니다 말했다 인수를 가지지 않는 방법에 대한

// as in the original post: 
private void doSomething(Action methodToBeCalled) 
{ 
    if (somethingIsTrue) 
    { 
     methodToBeCalled(); 
    } 
} 

,이 방법은 예를 들어, 호출 다음과 같이 당신이 인수하는 방법을 호출 할 경우

private void someMethod() 
{ 
    // ... 
} 

doSomething(someMethod); 

, 당신은 주위에 람다 함수를 래핑 할 수 있습니다 물론

private void someMethodWithArgument(int arg) 
{ 
    // ... 
} 

doSomething(() => someMethodWithArgument(42)); 

, 당신의 방법이 항상 같은 종류을 호출 할 경우 인수를 사용하면 doSomething 메서드를 선언하여 대신 Action<T>/Action<T,T>/등의 인수를 사용할 수 있습니다. 호출 된 메서드에서 값을 반환하도록하려면 Func<T> 패밀리의 대리자를 대신 사용하십시오.