지난번 메서드 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
아직 제대로 아는거 같지도 않고.
응용도 못하겠지만.
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