2009-10-10 5 views

답변

67

아니요. 일부 유틸리티 클래스에서는 "일반"정적 메서드에서와 같은 확장 메서드에서 동일한 작업을 수행 할 수 있습니다.

그래서이 확장 방법

public static void SomeMethod(this string s) 
{ 
    // do something with 's' 
} 

는 (적어도 당신이 액세스 할 수있는 관련)이 같은 일부 정적 도우미 메서드에 해당 :

public static void SomeStringMethod(string s) 
{ 
    // do something with 's' 
} 

가 (물론 당신이 일부 반사를 사용할 수 있습니다 두 가지 방법으로 비공개 멤버에 액세스 할 수 있습니다. 그러나이 질문의 요지는 아닙니다.)

+1

+1. 옆으로 비공개 확장 방법을 사용할 수 있습니다. http://odetocode.com/Blogs/scott/archive/2009/10/05/private-extension-methods.aspx에서 멋진 문서가 있습니다. 확장 메서드는 정적 유틸리티 클래스의 전용 정적 멤버에 액세스 할 수도 있습니다. – TrueWill

+3

이것은 C#으로 태그가 지정되었지만 확장 메서드를 지원하는 .NET 언어에도 적용됩니다. –

+0

@TrueWill - 정적이면서 중첩되지 않은 비 제네릭 타입이므로 모든 * 객체의 * 변수에 대한 개인 액세스를 실제로 가질 수 없습니다. '내부 '접근, 확실 -하지만'private'. –

3

아니요, 공개 소품을 통해 액세스 권한을 부여하지 않는 한 erties 또는 프록시 패턴.

11

번호 :

public class Foo 
{ 
    private string bar; 
} 

public static class FooExtensions 
{ 
    public static void Test(this Foo foo) 
    { 
     // Compile error here: Foo.bar is inaccessible due to its protection level 
     var bar = foo.bar; 
    } 
} 
0

연장 방법은 확장 메서드가 없음은 할 수 없습니다

15

에 호출 한 인스턴스의 공개 구성원에 그렇게 모든 액세스 권한이 기본적으로 정적 방법이다.하지

그러나 일반 정적 메서드로는 개인 필드에 액세스 할 수 없다는 점에서 다른 대답이 잘못되었음을 알고 싶습니다. 정적 메서드는 자체 클래스의 전용 비 정적 멤버 필드에 액세스 할 수 있습니다. 다음 코드는 완벽하게 유효하고 개인 필드에 액세스하는 정적 방법을 보여줍니다 다시 질문 ... 이제

public class Foo 
{ 
    private bool _field; 

    public static bool GetField(Foo foo) 
    { 
     return foo._field; 
    } 
} 

합니다. 확장 메서드는 다른 응답이 있다고 주장하는 정적 메서드에 (존재하지 않는) "동등성"이 주어지면 동일한 작업을 수행 할 수 있어야한다고 생각할 수도 있습니다. 그러나 중첩 클래스 내부에 확장 메서드를 선언 할 수는 없습니다. 그래서 당신은 다음을 수행하려고하면 : 당신은 컴파일 오류가

확장 방법은 최고 수준의 정적 클래스에 정의되어 있어야합니다

public class Foo 
{ 
    private bool _field; 

    public static class Extensions 
    { 
     public static bool GetField(this Foo foo) 
     { 
      return foo._field; 
     } 
    } 
} 

말을 얻을 것이다

; 확장은 중첩 된 클래스입니다.

흥미롭게도 this 키워드를 제거하면 코드가 올바르게 컴파일됩니다. 그 이유는 여기에 설명 : 당신은 당신이 확장하는 클래스를 소유하고 있다면

  1. Why are extension methods only allowed in non-nested, non-generic static class?
  2. Why not allow Extension method definition in nested class?
+1

공학 분야의 우수성. – Fattie

1

, 당신 항상, 부분 클래스를 선언 한 후 클래스 & 액세스 권한 확장 다른 파일의 모든 비공개 멤버들에게 ...하지만 당신은 실제로 확장 방법을 사용하지 않을 것입니다.

0

사용 반사

은 권장하지 않음,하지만 당신은 아마도 다른 확장 방법과 같이 사용하여 모든 유형의 개인 변수를 액세스 할 수 있습니다 :

public static T GetFieldValue<T>(this object obj, string name) { 
    var field = obj.GetType().GetField(name, BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance); 
    return (T)field?.GetValue(obj); 
} 

그리고 임의의 유형의 개인 필드에 액세스 :

Foo foo = new Foo(); 
string privateBar = foo.GetFieldValue<string>("_bar"); 
관련 문제