확장 메서드를 사용하여 개체의 개인 변수에 액세스 할 수 있습니까?C# 확장 메서드가 전용 변수에 액세스 할 수 있습니까?
답변
아니요. 일부 유틸리티 클래스에서는 "일반"정적 메서드에서와 같은 확장 메서드에서 동일한 작업을 수행 할 수 있습니다.
그래서이 확장 방법public static void SomeMethod(this string s)
{
// do something with 's'
}
는 (적어도 당신이 액세스 할 수있는 관련)이 같은 일부 정적 도우미 메서드에 해당 :
이public static void SomeStringMethod(string s)
{
// do something with 's'
}
가 (물론 당신이 일부 반사를 사용할 수 있습니다 두 가지 방법으로 비공개 멤버에 액세스 할 수 있습니다. 그러나이 질문의 요지는 아닙니다.)
아니요, 공개 소품을 통해 액세스 권한을 부여하지 않는 한 erties 또는 프록시 패턴.
번호 :
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 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
키워드를 제거하면 코드가 올바르게 컴파일됩니다. 그 이유는 여기에 설명 : 당신은 당신이 확장하는 클래스를 소유하고 있다면
공학 분야의 우수성. – Fattie
, 당신 항상, 부분 클래스를 선언 한 후 클래스 & 액세스 권한 확장 다른 파일의 모든 비공개 멤버들에게 ...하지만 당신은 실제로 확장 방법을 사용하지 않을 것입니다.
사용 반사
은 권장하지 않음,하지만 당신은 아마도 다른 확장 방법과 같이 사용하여 모든 유형의 개인 변수를 액세스 할 수 있습니다 :
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");
- 1. Java의 main에서 클래스의 전용 변수에 액세스 할 수 있습니까?
- 2. 확장 메서드가 "this"개체에 액세스 할 수 있습니까?
- 3. ApplicationContext.xml의 java 변수에 액세스 할 수 있습니까?
- 4. 개체의 멤버 변수에 액세스 할 수 있습니까?
- 5. 정적 메서드를 통해 인스턴스 변수에 액세스 할 수 있습니까?
- 6. objective-C NSThread는 전역 변수에 액세스 할 수 있습니까?
- 7. 익명 메서드가 로컬 변수에 액세스 할 때 런타임 예외를 throw합니다.
- 8. C# 메서드가 메서드를 반환 할 수 있습니까?
- 9. C++ 액세스 섹션을 인터리브 할 수 있습니까?
- 10. 내부 클래스의 메서드가 부모 클래스 메서드에 액세스 할 수 있습니까?
- 11. dll에는 제네릭 확장 메서드가 들어 있습니까?
- 12. C#에서 배열을 확장 할 수 있습니까?
- 13. 액션 필터가 컨트롤러의 전용 객체에 액세스 할 수 있습니까?
- 14. C#을 사용하여 Windows 환경 변수에 액세스 할 수 없습니다
- 15. ASP.NET C# Global_asax의 Application_Error가 세션 변수에 액세스 할 수 없음
- 16. 왜 내 변수에 액세스 할 수 없습니까?
- 17. setInterval은 변수에 액세스 할 수 없습니까?
- 18. if 문에서 변수에 액세스 할 수 없습니다.
- 19. 인스턴스 변수에 액세스 할 수 없습니다.
- 20. 어떻게 비 정적에 액세스 할 수 있습니까?
- 21. XXX에는 정의가없고 확장 메서드가 없습니다.
- 22. 어떻게하면 WAMP 서버로 환경 변수에 액세스 할 수 있습니까?
- 23. 객체의 속성이 아닌 메소드의 변수에 액세스 할 수 있습니까?
- 24. page.xaml.cs에서 외부 클래스의 멤버 변수에 액세스 할 수 있습니까?
- 25. 다른 파일에서 정적 변수에 어떻게 액세스 할 수 있습니까?
- 26. 컨트롤러에서 생성 된 뷰의 변수에 어떻게 액세스 할 수 있습니까?
- 27. 어떻게 JSP에서 javascript 변수에 액세스 할 수 있습니까?
- 28. ASP.NET은 ListView.EmptyDataTemplate에서 공용 페이지 변수에 액세스 할 수 있습니까?
- 29. Wordpress 페이지에서 POST 변수에 액세스 할 수 있습니까?
- 30. ASP.Net에서 Base 클래스의 Session 변수에 어떻게 액세스 할 수 있습니까?
+1. 옆으로 비공개 확장 방법을 사용할 수 있습니다. http://odetocode.com/Blogs/scott/archive/2009/10/05/private-extension-methods.aspx에서 멋진 문서가 있습니다. 확장 메서드는 정적 유틸리티 클래스의 전용 정적 멤버에 액세스 할 수도 있습니다. – TrueWill
이것은 C#으로 태그가 지정되었지만 확장 메서드를 지원하는 .NET 언어에도 적용됩니다. –
@TrueWill - 정적이면서 중첩되지 않은 비 제네릭 타입이므로 모든 * 객체의 * 변수에 대한 개인 액세스를 실제로 가질 수 없습니다. '내부 '접근, 확실 -하지만'private'. –