■ 리플렉션 박싱없이 비공개 필드 값 구하기

------------------------------------------------------------------------------------------------------------------------


TestProject.zip


Program.cs

 

 

using System;

using System.Reflection;

using System.Reflection.Emit;

 

namespace TestProject

{

    /// <summary>

    /// 프로그램

    /// </summary>

    class Program

    {

        //////////////////////////////////////////////////////////////////////////////////////////////////// Delegate

        ////////////////////////////////////////////////////////////////////////////////////////// Private

 

        #region 값 구하기 대리자 - GetValueDelegate<T>(sourceInstance)

 

        /// <summary>

        /// 값 구하기 대리자

        /// </summary>

        /// <typeparam name="T">값 타입</typeparam>

        /// <param name="sourceInstance">소스 인스턴스</param>

        /// <returns></returns>

        private delegate T GetValueDelegate<T>(object sourceInstance);

 

        #endregion

 

        //////////////////////////////////////////////////////////////////////////////////////////////////// Field

        ////////////////////////////////////////////////////////////////////////////////////////// Private

 

        #region Field

 

        /// <summary>

        ///

        /// </summary>

        private int value = 5;

 

        #endregion

 

        //////////////////////////////////////////////////////////////////////////////////////////////////// Method

        ////////////////////////////////////////////////////////////////////////////////////////// Static

        //////////////////////////////////////////////////////////////////////////////// Private

 

        #region 프로그램 시작하기 - Main()

 

        /// <summary>

        /// 프로그램 시작하기

        /// </summary>

        private static void Main()

        {

            Console.Title = "리플렉션 박싱없이 비공개 필드 값 구하기";

 

            Program program = new Program();

 

            program.value = 10;

 

            int value = GetNonPublicFieldValue<int>(program, "value");

 

            Console.WriteLine("value 속성 : {0}", value);

        }

 

        #endregion

 

        #region 비공개 필드 값 구하기 - GetNonPublicFieldValue<TField>(sourceInstance, fieldName)

 

        /// <summary>

        /// 비공개 필드 값 구하기

        /// </summary>

        /// <typeparam name="TField">필드 값 타입</typeparam>

        /// <param name="sourceInstance">소스 인스턴스</param>

        /// <param name="fieldName">필드명</param>

        /// <returns>필드 값</returns>

        private static TField GetNonPublicFieldValue<TField>(object sourceInstance, string fieldName)

        {

            FieldInfo fieldInfo = typeof(Program).GetField(fieldName, BindingFlags.Instance | BindingFlags.NonPublic);

 

            DynamicMethod dynamicMethod = new DynamicMethod

            (

                Guid.NewGuid().ToString(),

                typeof(TField),

                new Type[] { typeof(object) },

                sourceInstance.GetType(),

                false

            );

 

            ILGenerator generator = dynamicMethod.GetILGenerator();

 

            generator.Emit(OpCodes.Ldarg_0);

            generator.Emit(OpCodes.Ldfld, fieldInfo);

            generator.Emit(OpCodes.Ret);

 

            GetValueDelegate<TField> getValueDelegate =

                (GetValueDelegate<TField>)dynamicMethod.CreateDelegate(typeof(GetValueDelegate<TField>));

 

            TField result = getValueDelegate(sourceInstance);

 

            return result;

        }

 

        #endregion

    }

}

 

------------------------------------------------------------------------------------------------------------------------

Posted by 사용자 icodebroker