2013-03-14 2 views
4

내부 호출은 이런 객체는이 같은 기능을 내부 전화 여러 가지 방법을 갖고 객체를 var channel = new Chanel(); 있다. 내 질문에 어떻게 GetMethodExecution() 메서드를 호출하고 어떤 메서드를 전달할 전달 된 매개 변수를 기반으로이 함수 내에서 실행할 및 실행할 수 있습니다.패스 방법 및 기능

내가 필요한 것은 GetMethodExectution (IChannle.method1)을 호출 한 다음이 함수 내부의 개체에서 호출하는 것입니다. 이것은 당신이 람다 등을 통해 방법을 전달할 수 있습니다 지금

+2

큰 문맥이란 무엇입니까? 왜 '반사'가 최선의 선택이라고 확신합니까? 애플리케이션 상태에 따라 메소드를 개별적으로 호출하지 않는 이유는 무엇입니까? – Leri

+0

솔직히 Action이나 Func은 도움이 될지 모르지만 사용법을 알지 못했습니다. – kosnkov

+0

어떤 종류의 매개 변수가 전달 되었습니까? 호출 할 메서드 이름을 전달 하시겠습니까? –

답변

4
private bool GetMethodExecution(Func<Channel, bool> channelExecutor) 
{ 
    var channel = new Channel(); 
    return channelExecutor(channel); 
} 

가능 :

GetMethodExecution(ch => ch.method1()); 

GetMethodExecution(ch => ch.method2()); 
+0

ok하지만 GetMethodExecution 내부의 모든 메서드를 호출하고 그 메서드는 GetMethodExectution (IChannle.method1) 호출이 필요한 모든 인수를 취하지 않아도됩니다. – kosnkov

1

는이 같은 뭔가를 찾고 계십니까?

private bool GetMethodExecution(int method) 
{ 
    switch (method) 
    { 
     case 1: return new Channel().method1(); 
     case 2: return new Channel().method2(); 
     default: throw new ArgumentOutOfRangeException("method"); 
    } 
} 
GetMethodExecution(1); 
GetMethodExecution(2); 
+0

훨씬 더 많은 Func가 있지만 메서드에는 아무런 명령도 없습니다. – kosnkov

+0

GetMethodExecution (1); 어떤 메소드가 실행될지는 분명하지 않습니다. 메서드 호출 'Move (3)'과 'Move (player => player.Left())'의 차이점을 생각해보십시오. –

1

당신은 Func위임을 사용하여 다음과 같이 작업을 수행 할 수 있습니다

private bool GetMethodExecution(Func<bool> Method) 
{ 
    return Method() 
} 

public bool YourCallingMethod() 
{ 
    var channel = new Channel();   
    return GetMethodExecution(channel.method1); // Or return GetMethodExecution(channel.method2); 
} 
+0

거의 답이지만이 경우 GetMethodExecution 외부에서 개체를 만든 다음 메서드를 전달해야합니다. 하지만이 객체는 내가 아는 인터페이스이기 때문에 인터페이스의 메소드와 같은 최소 정보를 전달한 다음이 메소드 내부에서 호출 및 작성을 유지하려고합니다. – kosnkov

+0

구문이 올바르지 않습니다. 당신은 그것을 통과시키지 않고'method1'를 호출하고 있습니다. 위임자를 전달하려면 메소드 이름 다음에 괄호를 제거해야합니다. – Servy

0

당신은 매개 변수로 메소드 이름을 전달하고 코드 블록 내부를 호출 할 경우, 다음과 같이 리플렉션을 사용할 수 있습니다.

private bool GetMethodExecution(string methodName) 
{ 
    var channel = new Channel(); 

    Type type = typeof(Channel); 
    MethodInfo info = type.GetMethod(methodName); 

    return (bool)info.Invoke(channel, null); // # Assuming the methods you call return bool 
}