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/
반응형
'번역 > C# Notes for Professionals' 카테고리의 다른 글
48.13: IList<T> 에 대한 확장 메소드 예제 - 2 개의 List 비교하기 (0) | 2022.12.01 |
---|---|
48.12: 인터페이스와 확장 메소드를 활용한 DRY 원칙 기반의 코드 및 mix-in 과 유사한 기능 제공하기 (0) | 2022.10.21 |
48.10: 인터페이스에 확장 메소드 조합하기 (0) | 2022.10.21 |
48.9: 인터페이스에 확장 메소드 적용하기 (0) | 2022.10.21 |
48.8: 정적 (static) 타입에 기반한 확장 메소드 호출 (0) | 2022.10.21 |