2011-01-28 6 views
2

나는 반사 문제에 갇혀있어, 나는 그것이 진짜 큰 것은 아니라고 생각하지만, 이것에 대한 해결책을 찾지 못한다.C# Reflection on this-Object

public class myClass : myClassIF { 

    public myClass() { } 

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

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

    public void DecideAndCall(string identifier) { 
     string methodName = "doSomething_" + identifier; 
     MethodInfo mi = this.GetType().GetMethod(methodName); //here i got a NullReference?? 
     //here should be the Invocation of the Method and so on... 
    } 
} 

인터페이스가이 방법 같습니다

public interface myClassIF { 

    void DecideAndCall(string identifier); 

} 

내가 getMethod 메소드를 호출하는 경우를 ("...") - 방법, 난 항상 NullReference을 얻었다. 나는이 프로젝트의 다른 부분에서 전에 이것을 해 봤기 때문에 이것을 이해할 수 없다. 그러나 Refelction을 "This"가 아닌 다른 Type으로 사용했습니다.

실제로 인스턴스화 된 객체에서 메소드를 리플렉션 할 수 있습니까? 나는해야한다고 생각하지만, 어떻게해야할지 모르겠다. ...

많은 감사! Benni

+0

어떻게'DecideAndCall'를 호출 자세히 설명되어 있습니다 과부하가 BindingFlags의

MethodInfo mi = typeof(myClass).GetMethod(methodName, BindingFlags.Instance | BindingFlags.NonPublic); 

이를 복용 사용할 필요가? 당신은 확실히 "A"또는 "B"를 통과하고 있습니까? 메서드가 발견되지 않으면 GetMethod는 ArgumentNullException을 던집니다. 또는 문을 여러 단계로 나누어 Null 참조를 던지는 부분을 찾아야합니다. – Lazarus

+0

다음과 같이 코드를 실행할 때 null 참조 예외가 발생하지 않습니다.'var instance = new myClass(); instance.DecideAndCall ("A"); 그리고''A ''를 예를 들어. ''C '''또는''null''. 예외를 재생산하는 새로운 프로젝트를 만드시겠습니까? –

+1

이 질문에 대한 대답은 아니지만 각 클래스의 제공된 식별자를 기반으로 전환하는 것이 더 낫지는 않을 것입니다. 리플렉션을 사용하면 단순한 스위치와 비교할 때 매우 느릴 것입니다. 코드 작성이 빠르지 않을 수도 있습니다. – Hawxby

답변

12

검색 할 메서드는 private이지만 매개 변수가없는 Type.GetMethod 메서드는 public 메서드 만 찾습니다. 당신이 바인딩 제약 조건을 지정할 수 있습니다 overload을 시도해보십시오

BindingFlags flags = BindingFlags.Instance | BindingFlags.NonPublic; 
MethodInfo mi = GetType().GetMethod(methodName, flags); 

난 강력이 비록 같은 일을에 추천 할 것입니다. 객체가 자체에서 반사를 수행하는 것은 매우 드문 경우입니다.. 당신은 명백하게 유형 안전을 잃습니다. 예를 들어, 메소드에 대한 인수가 "A" 또는 "B"이 아닌 경우 제공된 샘플이 눈에 띄게 실패합니다. 실제 프로그램이 더 복잡하다고 확신 할지라도, 리플렉션이 필요하지 않은 방식으로이를 다시 디자인 할 수는 없습니까?

public void DecideAndCall(string identifier) 
{ 
    string methodName = "doSomething_" + identifier; 

    BindingFlags flags = BindingFlags.Instance | BindingFlags.NonPublic; 
    MethodInfo mi = this.GetType().GetMethod(methodName, flags); 
    // ... 
} 
2

방법은, 개인 있습니다. 방법은 개인이기 때문에

2

당신은 개인 방법으로 얻을 수있는 BindingFlags.NonPublic를 사용해야합니다 : 당신이 당신의 인수 BindingFlags.NonPublic을 지정해야합니다 있도록 관심있는