2010-08-14 3 views

답변

6

확장 방법들이 다른 클래스에 정의 된 것처럼 동작 정적 클래스의 정적 인 방법이 있습니다 :

그것은이 방법을 사용할 수있다.
형식 앞에있는 첫 번째 매개 변수는 확장 메서드임을 나타내는 this 키워드가됩니다.

예 :

public static class Extensions 
{ 
    public static object ExtensionMethodForStrings(this string s, object otherParameter) 
    { 
     //.... 
     return //whatever you want to return or not 
    } 
} 

이는 시스템에 확장 방법이다.두 개의 매개 변수를 문자열 : 는 - 문자열들 : -

정적 : 당신은 아무도

두 가지 방법으로이 방법을 호출 할 수 있습니다 포함되지 원하는만큼을 가질 수 객체 otherParameter이 인스턴스 변수 입니다 방법 :

string s = "Your string"; 
object o = new object(); // or whatever you want 
object result = Extensions.ExtensionMethodForStrings(s,o); 

확장 메서드 방법

string s = "Your string"; 
object o = new object(); // or whatever you want 
object result = s.ExtensionMethodForStrings(o); 

두 번째 경우에는 형식 문자열에 ExtensionMethodForStrings라는 인스턴스 메서드가있는 것처럼 작동합니다. 실제로 컴파일러에 대해서는 동등합니다.

+2

+1 당신이 여전히 정상적인 정적 방법이라고 부를 수 있다고 지적했습니다. 뿐만 아니라 'null'참조에서 호출 할 수도 있습니다. 메서드를 작성할 때이 두 가지 사실을 염두에 두는 것이 중요합니다. 'this' 인수가 null이 될 수 없다고 가정하지 마십시오. – Rich

2

확장 메서드를 사용하면 새 파생 형식을 만들거나 다시 컴파일하거나 원래 형식을 수정하지 않고도 기존 형식에 메서드를 "추가"할 수 있습니다. 확장 메서드는 특별한 종류의 정적 메서드이지만 확장 된 형식의 인스턴스 메서드 인 것처럼 호출됩니다. C# 및 Visual Basic으로 작성된 클라이언트 코드의 경우 확장 메서드를 호출하는 것과 형식에 실제로 정의 된 메서드간에 명백한 차이가 없습니다.

The C# article on Extension Methods.

1

확장 메서드는 정적 클래스의 정적 메서드이며, 첫 번째 매개 변수 앞에 키워드 this이옵니다.

C# 컴파일러에는 x.Foo(bar)의 전화를 SomeExtension.Foo(x, bar)으로 변환 할 수있는 구문 설탕이 있습니다. 이것은 LINQ (Take, Skip, Where, Select 등)에 광범위하게 사용되지만 원하는 경우 사용자 고유의 확장 방법을 작성할 수도 있습니다.

0

연장 방법은 클래스의 멤버와 같은 (다소) 동작 방법이지만 :

이 질문 유용 확장 방법의 예를 많이 포함 해당 클래스의 멤버가 아닙니다. 이 클래스의 멤버에게 호출 할 수는 있지만 클래스의 내부에 대한 참조는 없습니다.

확장 메서드는 정적 메서드이며 정적 클래스의 멤버 여야합니다.

public static class StringExtensions 
{ 
    public static string HtmlEncode(this string dataString) 
    { 
     return HttpServerUtility.HtmlEncode(dataString); 
    } 
} 

첫 번째 매개 변수 유형보다 키워드 "this"가 먼저 확장 방법 및 확장하는 클래스로 식별됩니다.

string foo = "bar"; 
string myOutput = foo.HtmlEncode(); 
관련 문제