Section 48.11: 동적 (dynamic) 코드에서의 확장 메소드 미지원

static class Program { static void Main() { dynamic dynamicObject = new ExpandoObject(); string awesomeString = "Awesome"; // True 를 출력한다 Console.WriteLine(awesomeString.IsThisAwesome()); dynamicObject.StringValue = awesomeString; // True 를 출력한다 Console.WriteLine(StringExtensions.IsThisAwesome(dynamicObject.StringValue)); // 컴파일 시점의 에러나 경고가 출력되진 않지만, 실행 시 RuntimeBinderException 이 발생된다 Console.WriteLine(dynamicObject.StringValue.IsThisAwesome()); } } static class StringExtensions { public static bool IsThisAwesome(this string value) { return value.Equals("Awesome"); } }

[동적 코드에서의 확장 메소드 호출] 이 동작하지 않는 이유는, 일반적인 비-동적 (non-dynamic) 코드에서는 확장 메소드 호출 시 컴파일러가 알 수 있는 모든 클래스들에 대해 일치하는 확장 메소드가 있는 정적 클래스를 찾는 전체 검색을 수행하기 때문이다. 이러한 검색은 namespace 중첩 탐색 및 각 namespace 내에 존재하는 using 지시어에 기반한 탐색을 순서대로 수행하는 방식으로 진행된다.

이것이 의미하는 바는, 동적 확장 메소드 호출을 정확하게 해석하기 위해서 DLR 이 실행 시점에 원래의 소스코드를 기반으로 한 모든 namespace 중첩 및 using 지시어 관련 정보를 알 수 있어야 한다는 의미이다. 현재 그러한 모든 정보를 손쉽게 각 호출 지점에 저장할 수 있는 체계가 마련되어 있지 않으며, 그러한 체계를 구현하기 위한 고려가 있긴 하였으나, 이는 과도한 비용과 일정상의 무리함에 비해 얻는 이득이 크지 않다고 판단되었다.

출처

본 문서는 C# Notes for Professionals (라이센스:CC-BY-SA) 를 한글로 번역한 문서입니다. 번역상 오류가 있을 수 있으므로 정확한 내용은 원본 문서를 참고하세요.

[출처] https://books.goalkicker.com/CSharpBook/

반응형

+ Recent posts