[C#/COMMON] 현재 실행하고 있는 메소드명 구하기
■ 현재 실행하고 있는 메소드명을 구하는 방법을 보여준다. ▶ 예제 코드 (C#)
1 2 3 4 5 6 7 8 |
using System; using System.Reflection; string methodName = MethodInfo.GetCurrentMethod().Name; Console.WriteLine(methodName); |
■ 현재 실행하고 있는 메소드명을 구하는 방법을 보여준다. ▶ 예제 코드 (C#)
1 2 3 4 5 6 7 8 |
using System; using System.Reflection; string methodName = MethodInfo.GetCurrentMethod().Name; Console.WriteLine(methodName); |
■ Assembly 클래스에서 어셈블리 GUID를 구하는 방법을 보여준다. ▶ 예제 코드 (C#)
1 2 3 4 5 6 |
using System; using System.Reflection; Guid guid = Assembly.GetExecutingAssembly().GetType().GUID; |
■ Assembly 클래스의 GetCustomAttributes 메소드를 사용해 어셈블리 정보를 구하는 방법을 보여준다. ▶ AssemblyHelper.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 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 |
using System; using System.Reflection; using System.Resources; using System.Runtime.InteropServices; namespace TestProject { /// <summary> /// 어셈블리 헬퍼 /// </summary> public class AssemblyHelper { //////////////////////////////////////////////////////////////////////////////////////////////////// Field ////////////////////////////////////////////////////////////////////////////////////////// Public #region Field /// <summary> /// 제목 /// </summary> public string Title = string.Empty; /// <summary> /// 설명 /// </summary> public string Description = string.Empty; /// <summary> /// 회사 /// </summary> public string Company = string.Empty; /// <summary> /// 제품 /// </summary> public string Product = string.Empty; /// <summary> /// 저작권 /// </summary> public string Copyright = string.Empty; /// <summary> /// 상표 /// </summary> public string Trademark = string.Empty; /// <summary> /// 어셈블리 버전 /// </summary> public string AssemblyVersion = string.Empty; /// <summary> /// 파일 버전 /// </summary> public string FileVersion = string.Empty; /// <summary> /// GUID /// </summary> public string GUID = string.Empty; /// <summary> /// 중립 언어 /// </summary> public string NeutralLanguage = string.Empty; /// <summary> /// COM 표시 여부 /// </summary> public bool IsCOMVisible = false; #endregion //////////////////////////////////////////////////////////////////////////////////////////////////// Constructor ////////////////////////////////////////////////////////////////////////////////////////// Public #region 생성자 - AssemblyHelper(assembly) /// <summary> /// 생성자 /// </summary> /// <param name="assembly">어셈블리</param> public AssemblyHelper(Assembly assembly) { AssemblyTitleAttribute assemblyTitleAttribute = GetAssemblyAttribute<AssemblyTitleAttribute>(assembly); if(assemblyTitleAttribute != null) { Title = assemblyTitleAttribute.Title; } AssemblyDescriptionAttribute assemblyDescriptionAttribute = GetAssemblyAttribute<AssemblyDescriptionAttribute>(assembly); if(assemblyDescriptionAttribute != null) { Description = assemblyDescriptionAttribute.Description; } AssemblyCompanyAttribute assemblyCompanyAttribute = GetAssemblyAttribute<AssemblyCompanyAttribute>(assembly); if(assemblyCompanyAttribute != null) { Company = assemblyCompanyAttribute.Company; } AssemblyProductAttribute assemblyProductAttribute = GetAssemblyAttribute<AssemblyProductAttribute>(assembly); if(assemblyProductAttribute != null) { Product = assemblyProductAttribute.Product; } AssemblyCopyrightAttribute assemblyCopyrightAttribute = GetAssemblyAttribute<AssemblyCopyrightAttribute>(assembly); if(assemblyCopyrightAttribute != null) { Copyright = assemblyCopyrightAttribute.Copyright; } AssemblyTrademarkAttribute assemblyTrademarkAttribute = GetAssemblyAttribute<AssemblyTrademarkAttribute>(assembly); if(assemblyTrademarkAttribute != null) { Trademark = assemblyTrademarkAttribute.Trademark; } AssemblyVersion = assembly.GetName().Version.ToString(); AssemblyFileVersionAttribute assemblyFileVersionAttribute = GetAssemblyAttribute<AssemblyFileVersionAttribute>(assembly); if(assemblyFileVersionAttribute != null) { FileVersion = assemblyFileVersionAttribute.Version; } GuidAttribute guidAttribute = GetAssemblyAttribute<GuidAttribute>(assembly); if(guidAttribute != null) { GUID = guidAttribute.Value; } NeutralResourcesLanguageAttribute neutralResourcesLanguageAttribute = GetAssemblyAttribute<NeutralResourcesLanguageAttribute>(assembly); if(neutralResourcesLanguageAttribute != null) { NeutralLanguage = neutralResourcesLanguageAttribute.CultureName; } ComVisibleAttribute comVisibleAttribute = GetAssemblyAttribute<ComVisibleAttribute>(assembly); if(comVisibleAttribute != null) { IsCOMVisible = comVisibleAttribute.Value; } } #endregion #region 생성자 - AssemblyHelper() /// <summary> /// 생성자 /// </summary> public AssemblyHelper() : this(Assembly.GetExecutingAssembly()) { } #endregion //////////////////////////////////////////////////////////////////////////////////////////////////// Method ////////////////////////////////////////////////////////////////////////////////////////// Static //////////////////////////////////////////////////////////////////////////////// Public #region 어셈블리 어트리뷰트 구하기 - GetAssemblyAttribute<T>(assembly) /// <summary> /// 어셈블리 어트리뷰트 구하기 /// </summary> /// <typeparam name="T">어트리뷰트 타입</typeparam> /// <param name="assembly">어셈블리</param> /// <returns>어셈블리 어트리뷰트</returns> public static T GetAssemblyAttribute<T>(Assembly assembly) where T : Attribute { object[] attributeArray = assembly.GetCustomAttributes(typeof(T), true); if((attributeArray == null) || (attributeArray.Length == 0)) { return null; } return (T)attributeArray[0]; } #endregion } } |
▶ MainForm.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 |
using System; using System.Windows.Forms; namespace TestProject { /// <summary> /// 메인 폼 /// </summary> public partial class MainForm : Form { //////////////////////////////////////////////////////////////////////////////////////////////////// Constructor ////////////////////////////////////////////////////////////////////////////////////////// Public #region 생성자 - MainForm() /// <summary> /// 생성자 /// </summary> public MainForm() { InitializeComponent(); #region 이벤트를 설정한다. Load += Form_Load; #endregion } #endregion //////////////////////////////////////////////////////////////////////////////////////////////////// Method ////////////////////////////////////////////////////////////////////////////////////////// Private //////////////////////////////////////////////////////////////////////////////// Event #region 폼 로드시 처리하기 - Form_Load(sender, e) /// <summary> /// 폼 로드시 처리하기 /// </summary> /// <param name="sender">이벤트 발생자</param> /// <param name="e">이벤트 인자</param> private void Form_Load(object sender, EventArgs e) { AssemblyHelper helper = new AssemblyHelper(); this.titleTextBox.Text = helper.Title; this.descriptionTextBox.Text = helper.Description; this.companyTextBox.Text = helper.Company; this.productTextBox.Text = helper.Product; this.copyrightTextBox.Text = helper.Copyright; this.trademarkTextBox.Text = helper.Trademark; this.assemblyVersionTextBox.Text = helper.AssemblyVersion; this.fileVersionTextBox.Text = helper.FileVersion; this.guidTextBox.Text = helper.GUID; this.neutralLanguageTextBox.Text = helper.NeutralLanguage; this.isCOMVisibleTextBox.Text = helper.IsCOMVisible.ToString(); } #endregion } } |
TestProject.zip
■ Type 클래스의 GetProperties 메소드를 사용하는 방법을 보여준다. ▶ MainWindow.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 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 |
using System; using System.Reflection; using System.Windows; using System.Windows.Input; using System.Windows.Media; namespace TestProject { /// <summary> /// 메인 윈도우 /// </summary> public class MainWindow : Window { //////////////////////////////////////////////////////////////////////////////////////////////////// Field ////////////////////////////////////////////////////////////////////////////////////////// Private #region Field /// <summary> /// 속성 정보 배열 /// </summary> private PropertyInfo[] propertyInfoArray; /// <summary> /// 속성 정보 배열 인덱스 /// </summary> private int propertyInfoArrayIndex = 0; #endregion //////////////////////////////////////////////////////////////////////////////////////////////////// Constructor ////////////////////////////////////////////////////////////////////////////////////////// Public #region 생성자 - MainWindow() /// <summary> /// 생성자 /// </summary> public MainWindow() { this.propertyInfoArray = typeof(Brushes).GetProperties(BindingFlags.Public | BindingFlags.Static); Width = 800; Height = 600; SetTitleAndBackground(); } #endregion //////////////////////////////////////////////////////////////////////////////////////////////////// Method ////////////////////////////////////////////////////////////////////////////////////////// Static //////////////////////////////////////////////////////////////////////////////// Public #region 프로그램 실행하기 - Main() /// <summary> /// 프로그램 실행하기 /// </summary> [STAThread] public static void Main() { Application application = new Application(); application.Run(new MainWindow()); } #endregion ////////////////////////////////////////////////////////////////////////////////////////// Instance //////////////////////////////////////////////////////////////////////////////// Public #region 키 다운시 처리하기 - OnKeyDown(e) /// <summary> /// 키 다운시 처리하기 /// </summary> /// <param name="e">이벤트 인자</param> protected override void OnKeyDown(KeyEventArgs e) { if(e.Key == Key.Down || e.Key == Key.Up) { this.propertyInfoArrayIndex += e.Key == Key.Up ? 1 : this.propertyInfoArray.Length - 1; this.propertyInfoArrayIndex %= this.propertyInfoArray.Length; SetTitleAndBackground(); } base.OnKeyDown(e); } #endregion //////////////////////////////////////////////////////////////////////////////// Private #region 제목/배경 설정하기 - SetTitleAndBackground() /// <summary> /// 제목/배경 설정하기 /// </summary> private void SetTitleAndBackground() { Title = "Type 클래스 : GetProperties 메소드 사용하기 : " + this.propertyInfoArray[this.propertyInfoArrayIndex].Name; Background = this.propertyInfoArray[this.propertyInfoArrayIndex].GetValue(null, null) as Brush; } #endregion } } |
TestProject.zip
■ Assembly 클래스의 GetExecutingAssembly 정적 메소드를 사용해 애플리케이션 실행 파일 경로를 구하는 방법을 보여준다. ▶ 예제 코드 (C#)
1 2 3 4 5 |
using System.Reflection; return Assembly.GetExecutingAssembly().Location; |
■ PropertyInfo 클래스의 SetValue 메소드를 사용해 속성 값을 설정하는 방법을 보여준다. ▶ PropertyInfo 클래스 : SetValue 메소드를 사용해 속성 값 설정하기 예제
■ Assembly 클래스의 GetExecutingAssembly 정적 메소드를 사용해 애플리케이션의 실행 디렉토리 경로를 구하는 방법을 보여준다. ▶ 예제 코드 (C#)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
using System.IO; using System.Reflection; #region 애플리케이션 실행 디렉토리 경로 구하기 - GetApplicationExecutableDirectoryPath() /// <summary> /// 애플리케이션 실행 디렉토리 경로 구하기 /// </summary> /// <returns>애플리케이션 실행 디렉토리 경로</returns> public static string GetApplicationExecutableDirectoryPath() { return Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location); } #endregion |
■ 객체 메소드를 동적으로 실행하는 방법을 보여준다. ▶ 예제 코드 (C#)
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 |
using System; using System.Reflection; #region 실행하기 - Execute(assembly, fullTypeName, methodName, parameterArray) /// <summary> /// 실행하기 /// </summary> /// <param name="assembly">어셈블리</param> /// <param name="fullTypeName">완전한 타입명</param> /// <param name="methodName">메소드명</param> /// <param name="parameterArray">매개 변수 배열</param> /// <returns>실행 결과</returns> public object Execute(Assembly assembly, string fullTypeName, string methodName, params object[] parameterArray) { Type classType = assembly.GetType(fullTypeName, true, false); object classObject = Activator.CreateInstance(classType); MethodInfo methodInfo = classType.GetMethod(methodName); object result = methodInfo.Invoke(classObject, parameterArray); return result; } #endregion |
■ 동적 객체를 사용하는 방법을 보여준다. ▶ 예제 코드 (C#)
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 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 |
using System; using System.Reflection; /// <summary> /// 동적 객체 /// </summary> public class DynamicObject { //////////////////////////////////////////////////////////////////////////////////////////////////// Field ////////////////////////////////////////////////////////////////////////////////////////// Private #region Field /// <summary> /// 객체 타입 /// </summary> private Type objectType; /// <summary> /// 소스 객체 /// </summary> private object sourceObject; /// <summary> /// 바인딩 플래그 /// </summary> private BindingFlags bindingFlags = BindingFlags.Instance | BindingFlags.Public; #endregion //////////////////////////////////////////////////////////////////////////////////////////////////// Property ////////////////////////////////////////////////////////////////////////////////////////// Public #region 객체 타입 - ObjectType /// <summary> /// 객체 타입 /// </summary> public Type ObjectType { get { return this.objectType; } } #endregion #region 소스 객체 - SourceObject /// <summary> /// 소스 객체 /// </summary> public object SourceObject { get { return this.sourceObject; } } #endregion #region 바인딩 플래그 - BindingFlags /// <summary> /// 바인딩 플래그 /// </summary> public BindingFlags BindingFlags { get { return this.bindingFlags; } set { this.bindingFlags = value; } } #endregion //////////////////////////////////////////////////////////////////////////////////////////////////// Constructor ////////////////////////////////////////////////////////////////////////////////////////// Public #region 생성자 - DynamicObject(sourceObject) /// <summary> /// 생성자 /// </summary> /// <param name="sourceObject">소스 객체</param> public DynamicObject(Object sourceObject) { if(sourceObject == null) { throw new ArgumentNullException("sourceObject"); } this.sourceObject = sourceObject; this.objectType = sourceObject.GetType(); } #endregion #region 생성자 - DynamicObject(objectType) /// <summary> /// 생성자 /// </summary> /// <param name="objectType">객체 타입</param> public DynamicObject(Type objectType) { if(objectType == null) { throw new ArgumentNullException("objectType"); } this.objectType = objectType; } #endregion //////////////////////////////////////////////////////////////////////////////////////////////////// Method ////////////////////////////////////////////////////////////////////////////////////////// Public #region 소스 객체 설정하기 - SetSourceObject(parameterTypeArray, parameterValueArray) /// <summary> /// 소스 객체 설정하기 /// </summary> /// <param name="parameterTypeArray">매개 변수 타입 배열</param> /// <param name="parameterValueArray">매개 변수 값 배열</param> public void SetSourceObject(Type[] parameterTypeArray, object[] parameterValueArray) { ConstructorInfo constructorInfo = this.objectType.GetConstructor(parameterTypeArray); if(constructorInfo == null) { throw new Exception("The constructor matching the specified parameter types is not found."); } this.sourceObject = constructorInfo.Invoke(parameterValueArray); } #endregion #region 소스 객체 생성하기 - SetSourceObject() /// <summary> /// 소스 객체 생성하기 /// </summary> public void SetSourceObject() { SetSourceObject(new Type[0], new object[0]); } #endregion #region 속성 값 구하기 - GetPropertyValue(propertyName) /// <summary> /// 속성 값 구하기 /// </summary> /// <param name="propertyName">속성명</param> /// <returns>속성 값</returns> public object GetPropertyValue(string propertyName) { object propertyValue = this.objectType.InvokeMember(propertyName, BindingFlags.GetProperty | bindingFlags, null, this.sourceObject, null); return propertyValue; } #endregion #region 속성 값 설정하기 - SetPropertyValue(propertyName, propertyValue) /// <summary> /// 속성 값 설정하기 /// </summary> /// <param name="propertyName">속성명</param> /// <param name="propertyValue">속성 값</param> public void SetPropertyValue(string propertyName, object propertyValue) { this.objectType.InvokeMember(propertyName, BindingFlags.SetProperty | this.bindingFlags, null, this.sourceObject, new object[] { propertyValue }); } #endregion #region 필드 값 구하기 - GetFieldValue(fieldName) /// <summary> /// 필드 값 구하기 /// </summary> /// <param name="fieldName">필드명</param> /// <returns>필드 값</returns> public object GetFieldValue(string fieldName) { object fieldValue = this.objectType.InvokeMember(fieldName, BindingFlags.GetField | this.bindingFlags, null, this.sourceObject, null); return fieldValue; } #endregion #region 필드 값 설정하기 - SetFieldValue(fieldName, fieldValue) /// <summary> /// 필드 값 설정하기 /// </summary> /// <param name="fieldName">필드명</param> /// <param name="fieldValue">필드 값</param> public void SetFieldValue(string fieldName, object fieldValue) { this.objectType.InvokeMember(fieldName, BindingFlags.SetField | this.bindingFlags, null, this.sourceObject, new object[] { fieldValue }); } #endregion #region 메소드 실행하기 - ExecuteMethod(methodName, parameterValueArray) /// <summary> /// 메소드 실행하기 /// </summary> /// <param name="methodName">메소드명</param> /// <param name="parameterValueArray">매개 변수 값 배열</param> /// <returns>반환 값</returns> public object ExecuteMethod(string methodName, params object[] parameterValueArray) { object returnValue = this.objectType.InvokeMember(methodName, BindingFlags.InvokeMethod | this.bindingFlags, null, this.sourceObject, parameterValueArray); return returnValue; } #endregion #region 메소드 실행하기 - ExecuteMethod(methodName, parameterTypeArray, parameterValueArray) /// <summary> /// 메소드 실행하기 /// </summary> /// <param name="methodName">메소드명</param> /// <param name="parameterTypeArray">매개 변수 타입 배열</param> /// <param name="parameterValueArray">매개 변수 값 배열</param> /// <returns>반환 값</returns> public object ExecuteMethod(string methodName, Type[] parameterTypeArray, object[] parameterValueArray) { if(parameterTypeArray.Length != parameterValueArray.Length) { throw new ArgumentException("The type for each parameter values must be specified."); } MethodInfo methodInfo = this.objectType.GetMethod(methodName, parameterTypeArray); if(methodInfo == null) { throw new ApplicationException(string.Format("The method {0} is not found.", methodName)); } object returnValue = methodInfo.Invoke(this.sourceObject, bindingFlags, null, parameterValueArray, null); return returnValue; } #endregion } |
■ 제네릭 인터페이스 타입 여부를 구하는 방법을 보여준다. ▶ 제네릭 인터페이스 타입 여부 구하기 예제 (C#)
1 2 3 4 5 6 7 8 9 10 |
using System; using System.Collections.Generic; using System.Collections.ObjectModel; Type sourceType = typeof(ObservableCollection<int>); Type targetGenericInterfaceType = typeof(IList<>); Console.WriteLine(IsGenericInterfaceType(sourceType, targetGenericInterfaceType)); |
▶ 제네릭 인터페이스 타입 여부
■ 조상 타입 여부를 구하는 방법을 보여준다. ▶ 조상 타입 여부 구하기 예제 (C#)
1 2 3 4 5 6 7 8 9 10 11 |
using System; using System.Windows.Forms; Type sourceType = typeof(TextBox); Type targetAncestorType = typeof(Control); bool result = IsAncestorType(sourceType, targetAncestorType); Console.WriteLine(result); |
▶ 조상 타입 여부 구하기 (C#)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
using System; #region 조상 타입 여부 구하기 - IsAncestorType(sourceType, targetAncestorType) /// <summary> /// 조상 타입 여부 구하기 /// </summary> /// <param name="sourceType">소스 타입</param> /// <param name="targetAncestorType">타겟 조상 타입</param> /// <returns>조상 타입 여부</returns> public bool IsAncestorType(Type sourceType, Type targetAncestorType) { bool result = targetAncestorType.IsAssignableFrom(sourceType); return result; } #endregion |
■ 지정한 타입의 항목을 갖는 제네릭 리스트를 구하는 방법을 보여준다. ▶ 예제 코드 (C#)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
using System; using System.Collections; using System.Collections.Generic; #region 리스트 구하기 - GetList(itemType) /// <summary> /// 리스트 구하기 /// </summary> /// <param name="itemType">항목 타입</param> /// <returns>리스트 인터페이스</returns> /// <remarks>지정한 타입의 항목을 갖는 제네릭 리스트를 반환한다.</remarks> public IList GetList(Type itemType) { Type listType = typeof(List<>).MakeGenericType(new[] { itemType }); return Activator.CreateInstance(listType) as IList; } #endregion |
■ 클래스 계층도를 만드는 방법을 보여준다. ▶ 클래스 계층도 만들기 예제 (C#)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
using System; using System.Collections.Generic; ... Type rootType = typeof(Object); List<Type> descendentTypeList = GetDescendentTypeList(rootType); // '자손 타입 리스트 구하기' 참조 ClassInfo rootClassInfo = new ClassInfo(rootType); BuildClassHierarchy(rootClassInfo, descendentTypeList); |
▶ 클래스 계층도 만들기 (C#)
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; using System.Collections.Generic; #region 클래스 계층도 만들기 - BuildClassHierarchy(parentClassInfo, descendentTypeList) /// <summary> /// 클래스 계층도 만들기 /// </summary> /// <param name="parentClassInfo">부모 클래스 정보</param> /// <param name="descendentTypeList">자손 타입 리스트</param> public void BuildClassHierarchy(ClassInfo parentClassInfo, List<Type> descendentTypeList) { foreach(Type descendentType in descendentTypeList) { Type parentType = descendentType.GetTypeInfo().BaseType; if(parentType == parentClassInfo.Type) { ClassInfo classInfo = new ClassInfo(descendentType); parentClassInfo.ChildClassInfoList.Add(classInfo); BuildClassHierarchy(classInfo, descendentTypeList); } } } #endregion |
■ 자손 타입 리스트를 구하는 방법을 보여준다. ▶ 예제 코드 (C#)
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 |
using System; using System.Collections.Generic; using System.Reflection; #region 자손 타입 리스트 구하기 - GetDescendentTypeList(parentType) /// <summary> /// 자손 타입 리스트 구하기 /// </summary> /// <param name="parentType">부모 타입</param> /// <returns>자손 타입 리스트</returns> public List<Type> GetDescendentTypeList(Type parentType) { TypeInfo parentTypeInfo = parentType.GetTypeInfo(); Assembly assembly = parentTypeInfo.Assembly; List<Type> typeList = new List<Type>(); foreach(Type type in assembly.ExportedTypes) { TypeInfo typeInfo = type.GetTypeInfo(); if(typeInfo.IsPublic && parentTypeInfo.IsAssignableFrom(typeInfo)) { typeList.Add(type); } } typeList.Sort((type1, type2) => { return string.Compare(type1.GetTypeInfo().Name, type2.GetTypeInfo().Name); }); return typeList; } #endregion |
■ 동적 클래스를 사용하는 방법을 보여준다. ▶ 동적 클래스 사용하기 예제 (C#)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
using System; DynamicClass dynamicClass = new DynamicClass(); dynamicClass.AddProperty("ID" , typeof(string)); dynamicClass.AddProperty("Name", typeof(string)); dynamicClass.CreateType(); dynamicClass.CreateInstance(); dynamicClass.SetValue(0, "0001" ); dynamicClass.SetValue(1, "홍길동"); dynamic employee = dynamicClass.Instance; Console.WriteLine(employee.ID ); Console.WriteLine(employee.Name); |
▶ 동적 클래스 사용하기 (C#)
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 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 |
using System; using System.Collections.Generic; using System.Reflection; using System.Reflection.Emit; /// <summary> /// 동적 클래스 /// </summary> public class DynamicClass : IDisposable { //////////////////////////////////////////////////////////////////////////////////////////////////// Field ////////////////////////////////////////////////////////////////////////////////////////// Static //////////////////////////////////////////////////////////////////////////////// Private #region Field /// <summary> /// 모듈 빌더 /// </summary> private static ModuleBuilder _moduleBuilder; /// <summary> /// 클래스 카운트 /// </summary> private static int _classCount; #endregion ////////////////////////////////////////////////////////////////////////////////////////// Instance //////////////////////////////////////////////////////////////////////////////// Private #region Field /// <summary> /// 타입 빌더 /// </summary> private TypeBuilder typeBuilder; /// <summary> /// 멤버 정보 리스트 /// </summary> private List<MemberInfo> memberInfoList = new List<MemberInfo>(); /// <summary> /// 타입 /// </summary> private Type type; /// <summary> /// 인스턴스 /// </summary> private object instance; /// <summary> /// GET 함수 리스트 /// </summary> private List<Func<object, object>> getFunctionList = new List<Func<object, object>>(); /// <summary> /// SET 액션 리스트 /// </summary> private List<Action<object, object>> setActionList = new List<Action<object, object>>(); #endregion //////////////////////////////////////////////////////////////////////////////////////////////////// Property ////////////////////////////////////////////////////////////////////////////////////////// Public #region 인스턴스 - Instance /// <summary> /// 인스턴스 /// </summary> public object Instance { get { return this.instance; } } #endregion //////////////////////////////////////////////////////////////////////////////////////////////////// Constructor ////////////////////////////////////////////////////////////////////////////////////////// Public #region 생성자 - DynamicClass /// <summary> /// 생성자 /// </summary> public DynamicClass() { if(_moduleBuilder == null) { AssemblyName assemblyName = new AssemblyName("DynamicAssembly"); AssemblyBuilder assemblyBuilder = AppDomain.CurrentDomain.DefineDynamicAssembly(assemblyName, AssemblyBuilderAccess.Run); _moduleBuilder = assemblyBuilder.DefineDynamicModule("DynamicModule"); } this.typeBuilder = _moduleBuilder.DefineType("DynamicClass_" + _classCount.ToString(), TypeAttributes.Public); _classCount++; } #endregion //////////////////////////////////////////////////////////////////////////////////////////////////// Method ////////////////////////////////////////////////////////////////////////////////////////// Public #region 필드 추가하기 - AddField(fieldName, fieldType) /// <summary> /// 필드 추가하기 /// </summary> /// <param name="fieldName">필드명</param> /// <param name="fieldType">필드 타입</param> public void AddField(string fieldName, Type fieldType) { FieldBuilder fieldBuilder = this.typeBuilder.DefineField(fieldName, fieldType, FieldAttributes.Public); this.memberInfoList.Add(fieldBuilder); } #endregion #region 속성 추가하기 - AddProperty(propertyName, propertyType) /// <summary> /// 속성 추가하기 /// </summary> /// <param name="propertyName">속성명</param> /// <param name="propertyType">속성 타입</param> public void AddProperty(string propertyName, Type propertyType) { FieldBuilder fieldBuilder = this.typeBuilder.DefineField("_" + propertyName, propertyType, FieldAttributes.Private); PropertyBuilder propertyBuilder = this.typeBuilder.DefineProperty(propertyName, PropertyAttributes.HasDefault, propertyType, null); MethodAttributes methodAttributes = MethodAttributes.Public | MethodAttributes.SpecialName | MethodAttributes.HideBySig; MethodBuilder getMethodBuilder = this.typeBuilder.DefineMethod("get_" + propertyName, methodAttributes, propertyType, Type.EmptyTypes); ILGenerator getILGenerator = getMethodBuilder.GetILGenerator(); getILGenerator.Emit(OpCodes.Ldarg_0); getILGenerator.Emit(OpCodes.Ldfld, fieldBuilder); getILGenerator.Emit(OpCodes.Ret); propertyBuilder.SetGetMethod(getMethodBuilder); MethodBuilder setMethodBuilder = this.typeBuilder.DefineMethod("set_" + propertyName, methodAttributes, null, new Type[] { propertyType }); ILGenerator setILGenerator = setMethodBuilder.GetILGenerator(); setILGenerator.Emit(OpCodes.Ldarg_0); setILGenerator.Emit(OpCodes.Ldarg_1); setILGenerator.Emit(OpCodes.Stfld, fieldBuilder); setILGenerator.Emit(OpCodes.Ret); propertyBuilder.SetSetMethod(setMethodBuilder); this.memberInfoList.Add(propertyBuilder); } #endregion #region 타입 생성하기 - CreateType() /// <summary> /// 타입 생성하기 /// </summary> public void CreateType() { this.type = this.typeBuilder.CreateType(); foreach(MemberInfo info in this.memberInfoList) { switch(info.MemberType) { case MemberTypes.Field : FieldInfo fieldInfo = this.type.GetField(info.Name); this.setActionList.Add(fieldInfo.SetValue); this.getFunctionList.Add(fieldInfo.GetValue); break; case MemberTypes.Property : PropertyInfo propertyInfo = this.type.GetProperty(info.Name); this.setActionList.Add(propertyInfo.SetValue); this.getFunctionList.Add(propertyInfo.GetValue); break; } } } #endregion #region 인스턴스 생성하기 - CreateInstance() /// <summary> /// 인스턴스 생성하기 /// </summary> /// <returns>인스턴스</returns> public object CreateInstance() { this.instance = Activator.CreateInstance(this.type); return this.instance; } #endregion #region 값 설정하기 - SetValue(index, value) /// <summary> /// 값 설정하기 /// </summary> /// <param name="index">인덱스</param> /// <param name="value">값</param> public void SetValue(int index, object value) { this.setActionList[index](this.instance, value); } #endregion #region 값 구하기 - GetValue(index) /// <summary> /// 값 구하기 /// </summary> /// <param name="index">인덱스</param> /// <returns>값</returns> public object GetValue(int index) { return this.getFunctionList[index](this.instance); } #endregion #region 리소스 해제하기 - Dispose() /// <summary> /// 리소스 해제하기 /// </summary> public void Dispose() { this.instance = null; this.type = null; this.typeBuilder = null; this.setActionList.Clear(); this.getFunctionList.Clear(); this.memberInfoList.Clear(); } #endregion } |
■ Type 클래스에서 Nullable 타입 여부를 구하는 방법을 보여준다. ▶ 예제 코드 (C#)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
using System; #region 널 가능 타입 여부 구하기 - IsNullableType(sourceType) /// <summary> /// 널 가능 타입 여부 구하기 /// </summary> /// <param name="sourceType">소스 타입</param> /// <returns>널 가능 타입 여부</returns> public bool IsNullableType(Type sourceType) { return (sourceType == typeof(string) || sourceType.IsArray || (sourceType.IsGenericType && sourceType.GetGenericTypeDefinition().Equals(typeof(Nullable<>)))); } #endregion |
■ Type 클래스에서 Nullable 타입을 구하는 방법을 보여준다. ▶ 예제 코드 (C#)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
using System; #region 널 가능 타입 구하기 - GetNullableType(sourceType) /// <summary> /// 널 가능 타입 구하기 /// </summary> /// <param name="sourceType">소스 타입</param> /// <returns>널 가능 타입</returns> public Type GetNullableType(Type sourceType) { Type targetType = sourceType; if(sourceType.IsGenericType && sourceType.GetGenericTypeDefinition().Equals(typeof(Nullable<>))) { targetType = Nullable.GetUnderlyingType(sourceType); } return targetType; } #endregion |
■ DataTable 객체에서 동적 클래스 컬렉션을 구하는 방법을 보여준다. ▶ DataTable 객체에서 동적 클래스 컬렉션 구하기 예제 (C#)
1 2 3 4 5 6 7 8 9 10 11 12 |
DataTable dataTable = new DataTable(); dataTable.Columns.Add("ID" , typeof(string)); dataTable.Columns.Add("Name", typeof(string)); dataTable.Rows.Add("0001", "김철수"); dataTable.Rows.Add("0002", "이순희"); dataTable.Rows.Add("0003", "홍길동"); ObservableCollection<object> collection = GetCollection(dataTable); |
▶ DataTable 객체에서
■ Activator 클래스의 CreateInstance 정적 메소드를 사용해 객체를 생성하는 방법을 보여준다. ▶ Activator 클래스 : CreateInstance 정적 메소드를 사용해 객체 생성하기 예제
■ ConstructorInfo 클래스의 Invoke 메소드를 사용해 객체를 생성하는 방법을 보여준다. ▶ ConstructorInfo 클래스 : Invoke 메소드를 사용해 객체 생성하기 예제 (C#)
1 2 3 4 5 6 7 8 9 10 11 |
using System; Type sourceType = GetType("System.Text.StringBuilder"); object instance1 = CreateObject(sourceType); object instance2 = CreateObject(sourceType, typeof(int), 100); Console.WriteLine(instance1.GetType()); Console.WriteLine(instance2.GetType()); |
■ AssemblyFileVersionAttribute 클래스의 Version 속성을 사용해 Win32 파일 버전 리소스명을 구하는 방법을 보여준다. ▶ 예제 코드 (C#)
1 2 3 4 5 6 7 8 9 |
using System.Reflection; Assembly assembly = Assembly.GetExecutingAssembly(); AssemblyFileVersionAttribute assemblyFileVersionAttribute = (AssemblyFileVersionAttribute)assembly.GetCustomAttributes(typeof(AssemblyFileVersionAttribute), false)[0]; string version = assemblyFileVersionAttribute.Version; |
■ AssemblyCopyrightAttribute 클래스의 Copyright 속성을 사용해 저작권 정보를 구하는 방법을 보여준다. ▶ 예제 코드 (C#)
1 2 3 4 5 6 7 8 9 |
using System.Reflection; Assembly assembly = Assembly.GetExecutingAssembly(); AssemblyCopyrightAttribute assemblyCopyrightAttribute = (AssemblyCopyrightAttribute)assembly.GetCustomAttributes(typeof(AssemblyCopyrightAttribute), false)[0]; string copyright = assemblyCopyrightAttribute.Copyright; |
■ AssemblyTitleAttribute 클래스의 Title 속성을 사용해 어셈블리 제목을 구하는 방법을 보여준다. ▶ 예제 코드 (C#)
1 2 3 4 5 6 7 8 9 |
using System.Reflection; Assembly assembly = Assembly.GetExecutingAssembly(); AssemblyTitleAttribute assemblyTitleAttribute = (AssemblyTitleAttribute)assembly.GetCustomAttributes(typeof(AssemblyTitleAttribute), false)[0]; string title = assemblyTitleAttribute.Title; |
■ 정적 속성 값을 구하는 방법을 보여준다. ▶ 정적 속성 값 구하기 예제 (C#)
1 2 3 4 5 |
using System.Windows.Media; Color color = GetStaticClassPropertyValue<Color>(typeof(Colors), "AliceBlue"); |
▶ 정적 속성 값 구하기 (C#)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
using System; #region 정적 클래스 속성 값 구하기 - GetStaticClassPropertyValue<TProperty>(staticClassType, propertyName) /// <summary> /// 정적 클래스 속성 값 구하기 /// </summary> /// <typeparam name="TProperty">속성 타입</typeparam> /// <param name="staticClassType">정적 클래스 타입</param> /// <param name="propertyName">속성명</param> /// <returns>정적 클래스 속성 값</returns> public TProperty GetStaticClassPropertyValue<TProperty>(Type staticClassType, string propertyName) { return (TProperty)staticClassType.GetProperty(propertyName).GetValue(null, null); } #endregion |
■ 정적 클래스 속성을 나열하는 방법을 보여준다. ▶ 예제 코드 (C#)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
using System; using System.Reflection; using System.Windows.Media; Type type = typeof(Colors); PropertyInfo[] propertyInfoArray = type.GetProperties(BindingFlags.Public | BindingFlags.Static); foreach(PropertyInfo propertyInfo in propertyInfoArray) { Console.WriteLine(propertyInfo.Name); } |