Share via


방법: 사용자 지정 확장 메서드 구현 및 호출(C# 프로그래밍 가이드)

업데이트: 2007년 11월

이 항목에서는 .NET Framework 클래스 라이브러리의 임의 형식이나 확장할 다른 모든 .NET 형식에 대해 고유한 확장 메서드를 구현하는 방법을 보여 줍니다. 클라이언트 코드는 확장 메서드를 포함하는 DLL에 대한 참조를 추가하고 확장 메서드가 정의된 네임스페이스를 지정하는 using 지시문을 추가하여 확장 메서드를 사용할 수 있습니다.

확장 메서드를 정의하고 호출하려면

  1. 확장 메서드를 포함하는 정적 클래스를 정의합니다.

    클래스가 클라이언트 코드에 표시되어야 합니다. 액세스 가능성 규칙에 대한 자세한 내용은 액세스 한정자(C# 프로그래밍 가이드)를 참조하십시오.

  2. 표시 유형이 적어도 포함하는 클래스와 동일한 정적 메서드로 확장 메서드를 구현합니다.

  3. 메서드의 첫 번째 매개 변수는 메서드가 작동하는 형식을 지정하며 앞에 this 한정자가 있어야 합니다.

  4. 호출 코드에서 using 지시문을 추가하여 확장 메서드 클래스를 포함하는 네임스페이스를 지정합니다.

  5. 형식의 인스턴스 메서드인 것처럼 메서드를 호출합니다.

    첫 번째 매개 변수는 연산자가 적용되는 형식을 나타내며 컴파일러가 개체의 형식을 이미 알고 있으므로 호출 코드에서 지정되지 않습니다. 매개 변수 2에서 n까지에 대한 인수만 제공하면 됩니다.

예제

다음 예제에서는 MyExtensions.StringExtension 클래스에 WordCount라는 확장 메서드를 구현합니다. 이 메서드는 첫 번째 메서드 매개 변수로 지정된 String 클래스에서 작동합니다. MyExtensions 네임스페이스를 응용 프로그램 네임스페이스로 가져오고 Main 메서드 내부에서 메서드가 호출됩니다.

using System.Linq;
using System.Text;
using System;

namespace CustomExtensions
{
    //Extension methods must be defined in a static class
    public static class StringExtension
    {
        // This is the extension method.
        // The first parameter takes the "this" modifier
        // and specifies the type for which the method is defined.
        public static int WordCount(this String str)
        {
            return str.Split(new char[] {' ', '.','?'}, StringSplitOptions.RemoveEmptyEntries).Length;
        }
    }
}
namespace Extension_Methods_Simple
{
    //Import the extension method namespace.
    using CustomExtensions;
    class Program
    {
        static void Main(string[] args)
        {
            string s = "The quick brown fox jumped over the lazy dog.";
            //  Call the method as if it were an 
            //  instance method on the type. Note that the first
            //  parameter is not specified by the calling code.
            int i = s.WordCount();
            System.Console.WriteLine("Word count of s is {0}", i);
        }
    }
}

코드 컴파일

이 코드를 실행하려면 Visual Studio에서 만들어진 Visual C# 콘솔 응용 프로그램 프로젝트에 코드를 복사하여 붙여넣습니다. 기본적으로 이 프로젝트는 .NET Framework의 버전 3.5를 대상으로 하며 System.Core.dll에 대한 참조와 System.Linq에 대한 using 지시문이 있습니다. 프로젝트에서 이러한 요구 사항 중 하나 이상이 누락된 경우 수동으로 추가할 수 있습니다. 자세한 내용은 방법: LINQ 프로젝트 만들기를 참조하십시오.

보안

확장 메서드는 특별히 보안상 취약한 부분을 제공하지 않습니다. 모든 이름 충돌이 형식 자체에서 정의된 인스턴스 또는 정적 메서드를 우선 적용하여 해결되기 때문에 확장 메서드를 사용하여 형식의 기존 메서드를 가장할 수 없습니다. 확장 메서드는 확장된 클래스의 전용 데이터에 액세스할 수 없습니다.

참고 항목

개념

C# 프로그래밍 가이드

참조

확장 메서드(C# 프로그래밍 가이드)

정적 클래스 및 정적 클래스 멤버(C# 프로그래밍 가이드)

protected(C# 참조)

internal(C# 참조)

public(C# 참조)

this(C# 참조)

namespace(C# 참조)

기타 리소스

LINQ(통합 언어 쿼리)