■ DynamicMethod 클래스의 Invoke 메소드를 사용해 구조체 크기를 구하는 방법을 보여준다.
▶ StructureHelper.cs
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 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 |
using System; using System.Collections.Generic; using System.Reflection.Emit; namespace TestProject { /// <summary> /// 구조체 헬퍼 /// </summary> public static class StructureHelper { //////////////////////////////////////////////////////////////////////////////////////////////////// Field ////////////////////////////////////////////////////////////////////////////////////////// Static //////////////////////////////////////////////////////////////////////////////// Private #region Field /// <summary> /// 타입 딕셔너리 /// </summary> private static Dictionary<Type, int> _typeDictionary = new Dictionary<Type, int>(); #endregion //////////////////////////////////////////////////////////////////////////////////////////////////// Method ////////////////////////////////////////////////////////////////////////////////////////// Static //////////////////////////////////////////////////////////////////////////////// Public #region 크기 구하기 - SizeOf(type) /// <summary> /// 크기 구하기 /// </summary> /// <param name="type">타입</param> /// <returns>크기</returns> public static int SizeOf(Type type) { int size; if(_typeDictionary.TryGetValue(type, out size)) { return size; } size = GetSize(type); _typeDictionary.Add(type, size); return size; } #endregion //////////////////////////////////////////////////////////////////////////////// Private #region 크기 - GetSize(type) /// <summary> /// 크기 구하기 /// </summary> /// <param name="type">타입</param> /// <returns>크기</returns> private static int GetSize(Type type) { DynamicMethod dynamicMethod = new DynamicMethod("SizeOfType", typeof(int), new Type[] { }); ILGenerator ilGenerator = dynamicMethod.GetILGenerator(); ilGenerator.Emit(OpCodes.Sizeof, type); ilGenerator.Emit(OpCodes.Ret); return (int)dynamicMethod.Invoke(null, null); } #endregion } } |
▶ Student.cs
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 26 27 28 29 30 31 32 33 34 |
using System; namespace TestProject { /// <summary> /// 학생 /// </summary> public unsafe struct Student { //////////////////////////////////////////////////////////////////////////////////////////////////// Property ////////////////////////////////////////////////////////////////////////////////////////// Public #region Field /// <summary> /// ID /// </summary> public int ID; /// <summary> /// 성명 /// </summary> public fixed char Name[20]; /// <summary> /// 생성 시간 /// </summary> public DateTime CreateTime; #endregion } } |
▶ Program.cs
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 26 27 28 29 30 |
using System; namespace TestProject { /// <summary> /// 프로그램 /// </summary> class Program { //////////////////////////////////////////////////////////////////////////////////////////////////// Method ////////////////////////////////////////////////////////////////////////////////////////// Static //////////////////////////////////////////////////////////////////////////////// Private #region 프로그램 시작하기 - Main() /// <summary> /// 프로그램 시작하기 /// </summary> private static void Main() { int size = StructureHelper.SizeOf(typeof(Student)); Console.WriteLine($"Student 구조체 크기 : {size}"); } #endregion } } |