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
키워드를 제거 하면 코드가 제대로 컴파일됩니다. 그 이유는 여기에서 설명합니다.
아니:
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
'ProgramingTip' 카테고리의 다른 글
Sun JDK의 소스 코드는 어디에서 볼 수 있습니까? (0) | 2020.11.11 |
---|---|
printf를 사용하여 size_t를 인쇄하는 올바른 방법은 무엇입니까? (0) | 2020.11.11 |
C ++ 크로스 플랫폼에서 URL을 파싱하는 쉬운 방법? (0) | 2020.11.11 |
씨 # /. NET에서 포인터를 사용하는 경우 (0) | 2020.11.11 |
매개 변수가 너무 많은 클래스 : 더 나은 설계 전략? (0) | 2020.11.11 |