2014-09-17 4 views
2

나는 프로젝트의 기본 클래스 AInvokeMethod를 선택적 매개 변수로 사용할 수 있습니까?

많은 서브 클래스는

public class A 
{ 
    public void Process(string myString1, int myInt1 ) 
     { 
      Type type = this.GetType(); 
      type.InvokeMember("ImAChildMethod", System.Reflection.BindingFlags.InvokeMethod 
               | System.Reflection.BindingFlags.NonPublic 
               | System.Reflection.BindingFlags.Instance, 
               null, 
               this, 
               new object[] { myString1, myInt1 }); 
     } 
} 

는 서브 클래스 A에서 상속이 있습니다 : 나는 Exeucte 그래서

public class B:A 
{ 
    private void ImAChildMethod(string myString, int myInt) 
    { 
    Console.WriteLine (myInt + ","+myString); 
    } 
} 

:

new B().Process("aaa",15); 내가 얻을

15

, AAA

.

일이 지난 지금 우리는 보낼 필요 -하지 :

new object[] { myString1, myInt1 }

하지만

new object[] { myString1, myInt1 , MyDateTime }

(단, 모든 서브 클래스는이 날짜 매개 변수를 사용하여)

좋아, 그래서 우리는 (특정 장소 에서) :

private void ImAChildMethod(string myString, int myInt) 

private void ImAChildMethod(string myString, int myInt ,DateTime myDateTime) 

에 따라서 문제는 어디에 있습니까?

우리가 변경하지 않은 곳에서는 예외가 발생했습니다.

상담자 모든 하위 클래스를 통해 이동 한 날짜의이 매개 변수를 추가하지 않으

.

ImAChildMethod에는 ,DateTime myDateTime이없고 사전에 "사전 인식"하는 방법이 있습니까 : 사용하고 있으면 사용하고 그렇지 않으면 - 새 매개 변수를 무시하십시오. ?

Nb를

내가 서브 클래스를 통해 이동 및 선택 매개 변수를 추가해야한다는 확신 ...하지만 내가 잘못 될 수 있을까요?

+0

ImAChildMethod가 A에서 추상이 아닌 이유가있는 이유는 무엇입니까? –

+0

@ vc74 "ImAChildMethod"는 클라이언트에서 보내는 문자열이므로 클라이언트에서 "x"메서드를 실행할 수 있습니다. –

답변

3

선택적 매개 변수가 정말 컴파일 타임 기능을합니다 - CLR 그리고 프레임 워크는 그들과 관련이 거의 없습니다. 정보를 을 이용하여을 리플렉션을 통해 만들 수 있습니다.

그래서 당신이 매개 변수 (ParameterInfo.IsOptional로) 선택이라는 사실을 감지하고 (ParameterInfo.DefaultValue과) 기본 가치를 얻을 수있는 동안 당신은 명시 적으로 할 필요가 - InvokeMember 당신을 위해 그것을하지 않습니다.

당신은 당신 만 이름에 동의하면, 당신은 오버로드 확인의 어색한 사업으로 얻을 것이다 명심 ... 효과적으로 InvokeMember 유사하지만 선택적 매개 변수를 처리하는 도우미 메서드를 작성 할 수 있습니다 . 단순성을 위해 단일 과부하가있는 이름으로 만 작업하도록 제한 할 수 있습니다.

1

당신은 Process 방법에 선택적 매개 변수를 추가 한 다음 자식 방법은 두 개 또는 세 개의 매개 변수가 있는지 확인할 수 있습니다, 그에 따라 호출 :

public void Process(string myString1, int myInt1, DateTime date = default(DateTime)) 
{ 
    Type type = this.GetType(); 
    var flags = BindingFlags.NonPublic | BindingFlags.Instance; 
    var method = type.GetMethod("ImAChildMethod", flags); 
    if(method.GetParameters().Length == 2) 
    { 
     type.InvokeMember("ImAChildMethod", System.Reflection.BindingFlags.InvokeMethod 
              | System.Reflection.BindingFlags.NonPublic 
              | System.Reflection.BindingFlags.Instance, 
              null, 
              this, 
              new object[] { myString1, myInt1 }); 
    } 
    else 
    { 
     type.InvokeMember("ImAChildMethod", System.Reflection.BindingFlags.InvokeMethod 
              | System.Reflection.BindingFlags.NonPublic 
              | System.Reflection.BindingFlags.Instance, 
              null, 
              this, 
              new object[] { myString1, myInt1,vdate }); 
    } 
} 
관련 문제