내부 클래스 내부의 System.Web.Script.Services.ScriptHandlerFactory 및 기타 .NET 항목에서 사용자 지정하려는 무언가가 있습니다. 불행히도 내부 클래스입니다. 이 클래스의 메소드를 사용자 정의 할 때 어떤 옵션이 있습니까?C#에서 내부 클래스를 어떻게 "오버라이드"합니까?
답변
this recent article 계몽일지도 모릅니다. 기본적으로 internal
으로 표시된 항목을 덮어 쓸 수 없다고 말합니다. 소스는 얻을 수있는만큼 신뢰할 수 있습니다. 가장 좋은 방법은 확장 방법입니다.
에릭 리 퍼트 (Eric Lippert)의 블로그는 훌륭한 자료입니다. – Kev
internal 키워드는 코드 단위 (클래스, 메서드 등)가 어셈블리에 "public"이지만 다른 어셈블리에 대해서는 private임을 나타냅니다.
동일한 어셈블리가 아니기 때문에 아무 것도 할 수 없습니다. 내부 클래스가 아닌 경우 클래스를 확장 할 때 재정의하는 메소드에서 new 키워드를 사용하여 원래 구현을 숨길 수 있습니다.
요컨대 : 당신은 SOL이되어야합니다.
제가 생각할 수있는 유일한 방법은 프록시 클래스를 작성하는 것입니다. 여기서 개인 필드 중 하나는 확장하려는 클래스이고 메소드와 프록시는 모두 구현합니다. 그런 식으로 출력을 커스터마이즈 할 수는 있지만, 클래스를 사용하게해야하고 내부적 인 것으로 생각하면 심각한 해킹 없이는 가능하지 않을 것입니다.
using System;
...
using System.Web.Script.Services
namespace MyGreatCompany.ScriptServices
{
public class MyScriptHandlerFactory /* implement all the interfaces */
{
private ScriptHandlerFactory internalFactory;
public MyScriptHandlerFactory()
{
internalFactory = new ScriptHandlerFactory();
}
...
}
}
이
수이 가능 달성하기 위해 원하는 것을 만들지 만, 꽤되지 않습니다.
Reflection을 사용하여 클래스의 액세스 한정자를 사용할 수 있다고 생각합니다. 그렇기 때문에 Reflection.Emit을 사용하여 내부 형식 (NOT sealed 한정자)을 상속하는 형식을 생성 할 수는 있지만 이 온라인의 예를 찾을 수 없습니다.
이것은 분명히 클래스의 private 멤버에 액세스하고, 아마도 봉인되지 않은 클래스의 상속을 위해 작동합니다. 그러나 대상 메소드가 이미 가상으로 표시되어 있지 않으면 많은 도움이되지 않습니다.
이것은 또한 완전히 신뢰할 수있을 때만 작동합니다. 확인이 필요한 모든 컨텍스트는 액세스 제어를 위반할 때 실패합니다. –
이 접근 방식은 System.TypeLoadException 같은 예외와 함께 작동하지 않습니다. 'MyAssembly, Version = 0.0.0.0, Culture = neutral, PublicKeyToken = null'어셈블리의 'MyClass'메서드에서 'MyOverridingMethod'메서드가 해당 어셈블리에서 보이지 않습니다. –
조립품에 따라 다릅니다. 이것은 아마도 (정적 링크의 일종에 있지만 그와 유사한) 일부 라이선스를 위반하고, 어쩌면 배포 악몽하게,하지만 당신은 고려할 수 수 :
- 디 컴파일하고 자신의 프로젝트를 통해 코드를 복사;
- 다시 컴파일/어셈블리를 패치 및 추가에 "InternalsVisibleToAttribute을"필요에 따라 수정
- 1. parent :: method를 사용하여 다른 클래스에서 호출 한 클래스를 어떻게 오버라이드합니까?
- 2. ServletRequestWrapper에서 요청 객체를 어떻게 오버라이드합니까?
- 3. Rails 2.3에서 RJS MIME 유형을 어떻게 오버라이드합니까?
- 4. iPhone : 내비게이션 컨트롤러에서 뒤로 버튼을 어떻게 오버라이드합니까?
- 5. 어떻게 파이썬 3에서 file.write()를 오버라이드합니까?
- 6. 내부 클래스를 검색하는 방법은 무엇입니까?
- 7. 내부 생성자를 사용하여 클래스를 deserialize
- 8. C에서 메타 클래스를 구현하려면 어떻게해야합니까?
- 9. c에서 readonly 클래스를 사용하여 디자인하기 #
- 10. MSBuild로 구축 할 때 InstallShield 경로 변수를 어떻게 오버라이드합니까?
- 11. LDAP 전용 보안 시스템을위한 Grails Spring Security 플러그인을 어떻게 오버라이드합니까?
- 12. Django의 클래스 기반 뷰에서`as_view`를 어떻게 오버라이드합니까?
- 13. 패키지 코드에서 제공하는 하스켈 유형 클래스 인스턴스를 어떻게 오버라이드합니까?
- 14. 스칼라에서 내부 클래스를 "오버라이드"하는 방법은 무엇입니까?
- 15. 다른 내부 클래스가 변경된 경우 내부 클래스를 컴파일해야합니까?
- 16. 내부 클래스를 인스턴스화하고 지정된 유형으로 캐스팅합니다.
- 17. C에서 플래시 애니메이션을 어떻게 재생합니까?
- 18. NHibernate에 대한 내부 매핑 클래스를 만드는 방법?
- 19. EasyMock을 사용하여 내부 클래스를 테스트하는 방법
- 20. 템플릿 클래스의 내부 클래스를 허용하는 함수의 문제점
- 21. NoClassDefFoundError 내부 클래스가있는 클래스를 가져 오는 중
- 22. Java reflection : 익명 내부 클래스를 검색하려면 어떻게해야합니까?
- 23. NUnit으로 개인 메서드와 내부 클래스를 테스트 하시겠습니까?
- 24. 선택기 클래스를 내부 생성자로 사용하는 이유는 무엇입니까?
- 25. GUI에 내부 클래스를 사용하기위한 표준은 무엇입니까?
- 26. Objective-C에서 클래스를 동적으로로드하는 방법은 무엇입니까?
- 27. Obj-C에서 주어진 클래스의 서브 클래스를 발견하십시오
- 28. 객관적인 C에서 C++ 템플릿 클래스를 사용하는 방법
- 29. Objective C에서 ConstantList 클래스를 만드는 방법
- 30. c에서 serialport 클래스를 사용할 수 있습니까?
읽어 나는 변경 될 수 있기 때문에 .. 확장되지 않습니다 나중에/진행중인 작업/아직 최고는 아님). 자신 만의 클래스 복제본을 만들고 꼭 사용해야하는 경우 사용하십시오. – Gishu