ProgramingTip

C # 확장 방법가 개인 변수에 액세스 할 수 있습니까?

bestdevel 2020. 11. 11. 20:30
반응형

C # 확장 방법가 개인 변수에 액세스 할 수 있습니까?


확장 방법을 사용하여 개체의 개인 변수에 액세스 할 수 있습니까?


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

그래서이 확장 방법은

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

다음과 같은 정적 도우미 메서드와 동일합니다 (적어도 액세스 할 수있는 항목에).

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

(물론 어떤 방법 으로든 비공개 멤버에 접근하기 위해 약간의 반성을 사용할 수 있습니다.하지만이 질문의 요점은 아닙니다.)


아니요.

그러나 일반 정적 메소드에 개인 필드에 액세스 할 수있는 것이 있고 싶습니다. 정적 메서드는 자체 클래스의 개인 비 정적 멤버 필드에 액세스 할 수 있습니다. 다음 코드는 완벽하게 유효하며 비공개 필드에 액세스하는 정적 메소드를 보여줍니다.

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. 확장 메서드가 중첩되지 않고 제네릭이 아닌 정적 클래스에서만 허용되는 이유는 무엇입니까?
  2. 중첩 클래스에서 확장 메서드 정의를 허용하지 않는 이유는 무엇입니까?

아니:

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;
    }
}

아니요, 공용 속성이나 프록시 패턴을 통해 어떤 종류의 액세스 권한을 부여하지 않는 한.


확장하는 클래스를 소유하고 있다면 항상 부분적인 클래스를 선언 한 다음 클래스를 확장하고 다른 파일의 모든 개인 멤버에 액세스 할 수 있습니다.하지만 실제로 확장 메서드를 사용하지는 않습니다.


반사 사용

권장하지 않지만 다음과 같은 다른 확장 방법을 사용하여 모든 유형의 개인 변수에 액세스 할 수 있습니다.

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");

확장 메서드는 기본적으로 정적 메서드이므로 액세스 할 수있는 모든 것은 확장 메서드가 호출 된 인스턴스의 공용 멤버입니다.

참고 URL : https://stackoverflow.com/questions/1548320/can-c-sharp-extension-methods-access-private-variables

반응형