C# 리플렉션으로 Struct(구조체 / ValueType) 수정(Set) 하기
StackOverflow에 매우 좋은 답변으로 달려 있는 내용인데, C#에서 Reflection을 이용해서 구조체(Struct)의 맴버 변수를 Set(Get)하려고 하면 제대로 작동되지 않는다.
접근할 수 없는 이유는 Struct는 ValueType으로 Stack에 할당되어 있기에 Reflection 연산으로 접근 할 수 없기 때문이다.
이를 의도된 Boxing을 통해서 Heap영역으로 옮긴 후 Reflection을 사용하는 방법이다.
물론 이때 다시 맴버 변수 접근으로 값을 가져오려면 Unboxing을 해야한다.
생각보다 퍼포먼스 손해가 많아 보이니, 꼭 필요한 경우나 어쩔수 없는 최후의(?) 상황에서 사용을 하자
이해를 돕기 위한 예시 코드는 아래와 같다
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 | // 테스트로 사용할 구조체 선언 public struct SomeStruct { // 맴버 변수 한개를 가지고 있다. public int a; } ... // 먼저 Reference Type의 object형에다가 Struct를 할당한다. object someObject = new SomeStruct(); // 여기서 boxing 발생 // Reflection으로 접근 하기 위해 타입 정보를 가져온다. var type = typeof (SomeStruct); // 해당 타입에서 접근하고자 하는 프로퍼티(맴버변수) 정보를 가져온다. var property = type.GetProperty( "a" ); // 프로퍼티 정보로 Heap에 있는 객체에 접근 및 값을 셋팅한다. property.SetValue(someObject, 12, null ); // 일반적인 ValueType으로 다시 돌린다, 이때 Unboxing이 발생한다. SomeStruct valueTypeObject = (SomeStruct)someObject; // 맴버변수 'a'에는 값 12가 들어 있다. int test = valueTypeObject.a; |
* 코드가 제대로 안나오면 F5(새로고침)해보세요
* 의사코드이므로 컴파일 안될 수 있습니다.
* Ref.https://stackoverflow.com/questions/6608368/why-doesnt-reflection-set-a-property-in-a-struct
'나만의 강의' 카테고리의 다른 글
C# 클래스 할당시 메모리 구성 디버깅 (1) | 2017.06.24 |
---|---|
게임 프로그래밍 공부 방법(입문) - 프로그래밍 공부, 대체 어떻게 해야 돼? (2) | 2014.05.09 |
[ToolFramewrok] 게임엔진과 툴을 연결하는 구조 1 (0) | 2014.03.26 |
[KGC2012 - 자료공개] WPF와 XBAP으로 만드는 개발툴 (0) | 2013.01.01 |
[자료공개] Boost Function ( 2008년 7월 4일 ) (0) | 2012.02.19 |
나만의 강의
2017. 6. 19. 15:42