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) 와 동일한 이름의 변수를 사용하기 위함입니다. 다음 링크에서 좀 더 상세한 설명을 확인하실 수 있습니다: 링크
또한, 이러한 정적 타입에 기반한 확장 메소드 호출은 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/
반응형
'번역 > C# Notes for Professionals' 카테고리의 다른 글
48.10: 인터페이스에 확장 메소드 조합하기 (0) | 2022.10.21 |
---|---|
48.9: 인터페이스에 확장 메소드 적용하기 (0) | 2022.10.21 |
48.7: 열거형 (Enumeration) 과 확장 메소드 (0) | 2022.09.22 |
48.6: 메소드 chaining 을 위한 확장 메소드 사용 (1) | 2022.09.22 |
48.5: 확장 메소드의 접근 가능 범위: public (혹은 internal) 멤버들 (0) | 2022.09.21 |