object로 형변환된 인스턴스를 원래의 타입 인자로 제네릭 메서드를 호출하는 방법
말이 좀 어려우니, 코드로 한번 볼까요? ^^
using System;
namespace ConsoleApp1
{
    enum MyEnum
    {
        A,
        B,
    }
    class Program
    {
        static void Main(string[] args)
        {
            object objValue = MyEnum.A;
            Program pg = new Program();
            pg.Test(objValue);
            pg.Test(MyEnum.A);
        }
        void Test<T>(T objValue)
        {
            Type type = typeof(T);
            Console.WriteLine(type.FullName); 
        }
    }
}
/*
출력 결과:
System.Object
ConsoleApp1.MyEnum
*/
위의 코드에서 같은 값임에도 불구하고 object로 형변환된 경우 제네릭 메서드가 "Test<object>(object objValue)"로 선택된 반면, 원래의 값으로 호출한 경우에는 "Test<ConsoleApp1.MyEnum>(ConsoleApp1.MyEnum objValue)"로 선택됩니다.
그러니까, object로도 "Test<ConsoleApp1.MyEnum>(ConsoleApp1.MyEnum objValue)"로 호출하고 싶다면 어떻게 해야 할까요? 어쩔 수 없습니다. 이런 경우에는 Reflection을 이용해야 하는데, 방식은 지난번 설명했던 내용을 기반으로 합니다.
C# - 제네릭 인자를 가진 타입을 생성하는 방법
; https://www.sysnet.pe.kr/2/0/11582
단지 이번에는 그 대상이 타입이 아니라 메서드로 바뀐 것뿐입니다.
using System;
using System.Reflection;
namespace ConsoleApp1
{
    enum MyEnum
    {
        A,
        B,
    }
    class Program
    {
        static void Main(string[] args)
        {
            object objValue = MyEnum.A;
            Program pg = new Program();
            pg.Test(objValue);
            pg.Test(MyEnum.A);
            pg.CallTest(objValue);
        }
        void CallTest(object objValue)
        {
            Type argType = objValue.GetType();
            MethodInfo mi = typeof(Program).GetMethod("Test", System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Instance);
            MethodInfo testMethod = mi.MakeGenericMethod(new Type[] { argType });
            testMethod.Invoke(this, new object[] { objValue });
        }
        void Test<T>(T objValue)
        {
            Type type = typeof(T);
            Console.WriteLine(type.FullName);
        }
    }
}
/*
출력 결과:
System.Object
ConsoleApp1.MyEnum
ConsoleApp1.MyEnum
*/
(
첨부 파일은 이 글의 예제 코드를 포함합니다.)
[이 글에 대해서 여러분들과 의견을 공유하고 싶습니다. 틀리거나 미흡한 부분 또는 의문 사항이 있으시면 언제든 댓글 남겨주십시오.]