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
*/
(
첨부 파일은 이 글의 예제 코드를 포함합니다.)
[이 글에 대해서 여러분들과 의견을 공유하고 싶습니다. 틀리거나 미흡한 부분 또는 의문 사항이 있으시면 언제든 댓글 남겨주십시오.]