지난번 메서드 Reflection에 이어서. 이번엔 필드!!!

사실.
reflection으로 메서드를 가져와서 실행시킬수 있다면
당연히 필드도. 비슷하게 핸들링 할수 있을꺼라 생각은 했지만.
(이상하게도!!) 방법을 못찾겠더라구요...

사실 계속
getMember로 가져와서 요고저고 해보니까 안되서 포기했었는데
써야할꺼 같은 일이 생겨서
(써야 한다기 보단.. 코딩양을 좀 줄이려고.... 성능은 신경도 안쓰고...)
다시 찾아보니..
FieldInfo라는게 있더라구요..


사용법은 method랑 거의 비슷합니다.

제가 하려고 했던건
동적으로 field를 가져와서 값을 할당하는거였는데

이렇게 하면 되네요..


FieldInfo fi = this.GetType().GetField("FABRIC_SEQ", BindingFlags.NonPublic | BindingFlags.Instance);
fi.SetValue(this, "할당해줄 값");

이 소스에서는
FABRIC_SEQ라는 필드가. private string으로 선언되어 있습니다. (멤버변수로)
그걸 가져와서
원하는 값으로 할당해 주는건데.

지금 하고 있는게 탭이 상당히 많은 페이지고
탭 마다 셋팅해야 할 값들이 다 달라서.
이렇게 해주니 코드가 많이 줄어드네요..
뭐.. 성능은.. 모르겠네요..

그래도 하나 더 알아냈으니 됐음!
by 피요히코~ 2010. 5. 10. 17:19
지난번에 포스팅 했던 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
| 1 |