반응형

확장 메서드를 사용하기 위해서 클래스를 만드는데 이때 클래스명이 문법적의 컴파일 오류에 있어서 중요한것은 아니고 


public static void method(타입 src, ... ){
}


의 함수에서 타입 자리에 어떤 타입이 오는지에 따라 호출 할 수있는 원본 클래스가 결정된다는 부분이 구분역할로써 중요하다





\



C# 확장 메서드 (Extension Method) 

C# 3.0부터 지원하는 확장메서드(Extension Method)는 특수한 종류의 static 메서드로서 마치 다른 클래스의 인스턴스 메서드인 것처럼 사용된다. 일반적으로 instance 메서드를 추가하기 위해서는 해당 클래스안에 메서드를 추가한다. 만약 여러 개의 클래스들에 instance 메서드를 추가하고 싶다면, 각 클래스마다 메서드를 추가해 주어야 한다 (물론 Base Class가 있는 경우, 클래스 상속을 이용할 수도 있다). 

확장 메서드는 메서드가 사용될 클래스명(혹은 Type)을 첫번째 파라미터로 지정하여 마치 해당 클래스(혹은 Type)가 확장메서드를 인스턴스 메서드로 갖는 것과 같은 효과를 낸다. 약간 특이한 문법이지만, 확장 메서드의 첫번째 파라미터는 앞에 항상 this를 써준다.

아래 예제는 String 클래스를 첫번째 파라미터로 갖는 확장메서드 즉 String 클래스에서만 동작하는 확장 메서드를 정의한 예이다. 

using System;
using System.Text;

namespace MySystem
{
   // static class를 정의
   public static class ExClass
   {
      // static 확장메서드를 정의. 첫번째 파라미터는
      // 어떤 클래스가 사용할 지만 지정. 
      public static string ToChangeCase(this String str)
      {
         StringBuilder sb = new StringBuilder();
         foreach (var ch in str)
         {
            if (ch >= 'A' && ch <= 'Z')
               sb.Append((char)('a' + ch - 'A'));
            else if (ch >= 'a' && ch <= 'x')
               sb.Append((char)('A' + ch - 'a'));
            else
               sb.Append(ch);
         }
         return sb.ToString();
      }

      // 이 확장메서드는 파라미터 ch가 필요함
      public static bool Found(this String str, char ch)
      {
         int position = str.IndexOf(ch);
         return position >= 0;
      }
   }

   class Program
   {
      static void Main(string[] args)
      {
         string s = "This is a Test";
         
         // s객체 즉 String객체가
         // 확장메서드의 첫 파리미터임
         // 실제 ToChangeCase() 메서드는
         // 파라미터를 갖지 않는다.
         string s2 = s.ToChangeCase();

         // String 객체가 사용하는 확장메서드이며
         // z 값을 파라미터로 사용
         bool found = s.Found('z');
      }
   }
}


http://www.csharpstudy.com/CSharp/CSharp-extension-method.aspx




다른 예제



public bool Contains(String value);


해당 문자열에 value 값이 포함되있는지 비교한다. 


해당 키워드는 대소문자를 구문한다.


 


만약 대소문자를 비교하려면 StringExtensions 기능을 이용하여 만들어줘야한다.

(C#은 Extensions를 이용하여 객체 내부의 명시된 클래스를 사용하여 기능을 확장을 정의할 수 있다. )





이렇게 대소문자 구분 무시

 



반응형

'프로그래밍(Programming) > C#' 카테고리의 다른 글

제너릭의 장점과 boxing & unboxing  (0) 2017.09.08
using 과 Dispose()  (0) 2017.07.19
프로퍼티 value  (0) 2015.11.17
정적 생성자가 호출되는 시점  (0) 2015.11.14
AssemblyInfo.cs  (0) 2015.11.11

+ Recent posts