지난번에 포스팅 했던 reflection을 사용하다가.
또 알아낸게 있어서 두번째로 다시 포스팅 합니다. ㅋ

메소드를 읽어올때
그냥 메소드 명만 써주면 기본적으로 public 메소드만 가지고 와 집니다.
(전 그래서 메소드를 다 public으로 바꿨.....)

근데 이게
GetMethod에 두번째 파라미터가 있는데. (있는건 알았지만 몰라서 안썼...)
BindingFlags 를 정해주는게 있습니다.
(자세한 내용은 MSDN)

이 파라미터를 지정해 주면
(MSDN말처럼)리플렉션에서 멤버 및 형식 검색이 수행되는 방식과 바인딩을 제어하는 플래그를 지정해 줄수 있습니다.

이렇게 하면 private 메소드도 가져올수 있죠.

그래서 테스트를 해봤습니다.


this.GetType().GetMethod("LF_Save" + tab_Now.Name, BindingFlags.NonPublic);

근데 이렇게 했더니
MethodInfo 가 계속 null이 되더라구요

왜그런가 싶어서 메소드를 다시 public으로 바꾸고
BindingFlags를 Public으로 줘봤는데도...
null... :(

이곳저곳 막 뒤져봤는데 이유를 못찾겠더라구요....

근데역시나..
MSDN을 제대로 안본탓...
MSDN에 이런말이 있더라구요...
Instance 또는 StaticPublic 또는 NonPublic과 함께 지정해야 합니다. 그렇지 않으면 멤버가 반환되지 않습니다.

쿠쿵.. ㅠㅠ

그래서



this.GetType().GetMethod("LF_Save" + tab_Now.Name, BindingFlags.NonPublic | BindingFlags.Instance);

이렇게 하니 잘 되네요... ㅠㅠ
아.....
아......
역시.. 할라면 제대로 하라고..
MSDN을 보려면 제대로 봐야 하네요.....

그래도 하려던게 잘 되서 다행입니다. ㅠㅠ
by 피요히코~ 2010. 5. 7. 11:38
아직 제대로 아는거 같지도 않고.
응용도 못하겠지만.
reflection이라는건 참으로 유용한거 같네요.
이전에 실버라이트쪽에서 reflection으로 페이지 호출하는거 포스팅도 했었는데.
이번엔 간단한 method reflection 예제입니다.

아주 간단한데.
이게 잘 쓰면 코드량을 상당히 줄여줄꺼 같네요...
(이러라고 쓰는게 맞는건 아닌거 같지만. ㅋ)


MethodInfo method = (메소드를 가지고 있는 인스턴스?)GetType().GetMethod("메소드명");
method.Invoke((호출할 인스턴스), (파라미터));

이런식으로 쓰면 됩니다.

만약에 GetMethod에 넣은 메소드명이. 존재하지 않는 메소드라고 하면
method는 null이 되므로
method.Invoke를 호출하기 전에 null 체크를 해주는게 좋겠죠?

그리고
도움말에 나오지만
Invoke의 첫번째 파라미터는 static method의 경우는 무시되고
두번째 파라미터는 Object[] 형식이고
파라미터가 없는 메소드의 경우에는 null입니다.

*추가 주의사항
  전혀 모르고 있다가 MSDN찾아보고 알게된게 있네요..
 GetMethod로 메소드를 찾을때 해당 메소드는 public이여야 합니다... ㅠㅠ 몰라서 한참 헤맸네요. ㅠㅠ
by 피요히코~ 2010. 4. 29. 15:15

어처구니 없는 실수지만.
가끔 하는 실수..

STRING에서 메소드를 사용하려고 할때
(가령 SPLIT, TRIM, REMOVE..)

단순히 String.Trim() 을 한다고 해서 해당 string값이 변경되는게 아니다..
다시 그 string에 넣어줘야만 적용이 되는것이다... 라는..

아주 단순하고 쉬운건데
계속 헷깔려 하다가 결국 디버깅하다가 발견하곤 한다. -_-ㅋ

한심한 나...
ㅠ_-
by 피요히코~ 2009. 3. 9. 15:24
| 1 |