Type, MethodInfo, PropertyInfo 같은 타입을 직접 다룬다.예:
dynamic json = JsonConvert.DeserializeObject(jsonText);
Console.WriteLine(json.name);
Console.WriteLine(json.address.city);
DTO를 정식으로 만들기 전, 프로토타입/테스트 단계에서 빠르게 다뤄볼 때도 많이 사용한다.
Attribute가 붙은 멤버만 골라서 처리예:
Type type = obj.GetType();
foreach (var prop in type.GetProperties())
{
var value = prop.GetValue(obj);
Console.WriteLine($"{prop.Name} = {value}");
}
dynamic은 내부적으로 한 번 바인딩한 결과를 캐시하는 등 최적화가 들어가 있지만, 여전히 정적 호출보다는 비싸다.reflection은 개발자가 잘못 쓰면 훨씬 비싸질 수 있다.
GetMethod, GetProperty 호출RuntimeBinderException 발생dynamic d = "Hello";
d.NonExistMethod(); // 컴파일 OK, 실행 시 RuntimeBinderException
null 여부를 체크해서, 예외를 직접 제어할 수 있다.Invoke하면 여전히 런타임 예외가 발생한다.var mi = obj.GetType().GetMethod("Run");
if (mi != null)
{
mi.Invoke(obj, null); // 시그니처가 맞지 않으면 여기서 예외
}
else
{
Console.WriteLine("Run 메서드가 없습니다.");
}
dynamic과 reflection을 이해할 때 자주 같이 언급되는 키워드가 var, object라서,
간단하게 비교해 두면 기억하기 좋다.
var
object
ArrayList).dynamic