Section 48.4: Generic 확장 메소드

다른 메소드들과 마찬가지로, 확장 메소드 역시 generic 을 사용할 수 있다. 다음 예제를 확인한다:

static class Extensions { public static bool HasMoreThanThreeElements<T>(this IEnumerable<T> enumerable) { return enumerable.Take(4).Count() > 3; } }

이는 다음과 같이 호출할 수 있다:

IEnumerable<int> numbers = new List<int> {1,2,3,4,5,6}; var hasMoreThanThreeElements = numbers.HasMoreThanThreeElements();

Demo 확인하기

마찬가지로, 복수개의 Type Argument 를 갖는 경우는 다음과 같이 작성할 수 있다:

public static TU GenericExt<T, TU>(this T obj) { TU ret = default(TU); // obj 에 대한 작업을 수행한다 return ret; }

이는 다음과 같이 호출할 수 있다:

IEnumerable<int> numbers = new List<int> {1,2,3,4,5,6}; var result = numbers.GenericExt<IEnumerable<int>,String>();

Demo 확인하기

다중 generic 타입 중에서 일부만이 bind 된 타입에 대해서도 마찬가지로 확장 메소드를 만들 수 있다:

class MyType<T1, T2> { } static class Extensions { public static void Example<T>(this MyType<int, T> test) { } }

호출은 다음과 같이 할 수 있다:

MyType<int, string> t = new MyType<int, string>(); t.Example();

Demo 확인하기

where 문을 통한 타입 제약 조건을 명시하는 것 또한 가능하다:

public static bool IsDefault<T>(this T obj) where T : struct, IEquatable<T> { return EqualityComparer<T>.Default.Equals(obj, default(T)); }

호출 코드:

int number = 5; var IsDefault = number.IsDefault();

Demo 확인하기

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

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

반응형

+ Recent posts