Section 48.8: 정적 (static) 타입에 기반한 확장 메소드 호출

확장 메소드의 첫번째 파라미터 타입 부합 여부는 동적 (런타임) 타입이 아닌 정적 (컴파일 타임) 타입에 따라 결정된다.

public class Base { public virtual string GetName() { return "Base"; } } public class Derived: Base { public override string GetName() { return "Derived"; } } public static class Extensions { public static string GetNameByExtension(this Base item) { return "Base"; } public static string GetNameByExtension(this Derived item) { return "Derived"; } } public static class Program { public static void Main() { Derived derived = new Derived(); Base @base = derived; // "GetName" 인스턴스 메소드를 호출한다 Console.WriteLine(derived.GetName()); // "Derived" 가 출력된다 Console.WriteLine(@base.GetName()); // "Derived" 가 출력된다 // "GetNameByExtension" 정적 확장메소드를 호출한다 Console.WriteLine(derived.GetNameByExtension()); // "Derived" 가 출력된다 Console.WriteLine(@base.GetNameByExtension()); // "Base" 가 출력된다 } }

역주: 위 예제에서 @base 와 같이 변수 이름 앞에 @가 붙은 것은, 예약어 (reserved keyword) 와 동일한 이름의 변수를 사용하기 위함입니다. 다음 링크에서 좀 더 상세한 설명을 확인하실 수 있습니다: 링크

.NET Fiddle 에서 라이브 데모 확인하기

또한, 이러한 정적 타입에 기반한 확장 메소드 호출은 dynamic 객체에 대해서 호출을 허용하지 않는다:

public class Person { public string Name { get; set; } } public static class ExtenionPerson { public static string GetPersonName(this Person person) { return person.Name; } } dynamic person = new Person { Name = "Jon" }; var name = person.GetPersonName(); // RuntimeBinderException 예외가 발생한다
본 문서는 C# Notes for Professionals (라이센스:CC-BY-SA) 를 한글로 번역한 문서입니다. 번역상 오류가 있을 수 있으므로 정확한 내용은 원본 문서를 참고하세요.

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

반응형

+ Recent posts