2008-10-13 2 views
9

내부 클래스 내부의 System.Web.Script.Services.ScriptHandlerFactory 및 기타 .NET 항목에서 사용자 지정하려는 무언가가 있습니다. 불행히도 내부 클래스입니다. 이 클래스의 메소드를 사용자 정의 할 때 어떤 옵션이 있습니까?C#에서 내부 클래스를 어떻게 "오버라이드"합니까?

+0

읽어 나는 변경 될 수 있기 때문에 .. 확장되지 않습니다 나중에/진행중인 작업/아직 최고는 아님). 자신 만의 클래스 복제본을 만들고 꼭 사용해야하는 경우 사용하십시오. – Gishu

답변

6

this recent article 계몽일지도 모릅니다. 기본적으로 internal으로 표시된 항목을 덮어 쓸 수 없다고 말합니다. 소스는 얻을 수있는만큼 신뢰할 수 있습니다. 가장 좋은 방법은 확장 방법입니다.

+0

에릭 리 퍼트 (Eric Lippert)의 블로그는 훌륭한 자료입니다. – Kev

5

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(); 
     } 
     ... 
    } 
} 

이 가능 달성하기 위해 원하는 것을 만들지 만, 꽤되지 않습니다.

1

Reflection을 사용하여 클래스의 액세스 한정자를 사용할 수 있다고 생각합니다. 그렇기 때문에 Reflection.Emit을 사용하여 내부 형식 (NOT sealed 한정자)을 상속하는 형식을 생성 할 수는 있지만 이 온라인의 예를 찾을 수 없습니다.

이것은 분명히 클래스의 private 멤버에 액세스하고, 아마도 봉인되지 않은 클래스의 상속을 위해 작동합니다. 그러나 대상 메소드가 이미 가상으로 표시되어 있지 않으면 많은 도움이되지 않습니다.

+0

이것은 또한 완전히 신뢰할 수있을 때만 작동합니다. 확인이 필요한 모든 컨텍스트는 액세스 제어를 위반할 때 실패합니다. –

+3

이 접근 방식은 System.TypeLoadException 같은 예외와 함께 작동하지 않습니다. 'MyAssembly, Version = 0.0.0.0, Culture = neutral, PublicKeyToken = null'어셈블리의 'MyClass'메서드에서 'MyOverridingMethod'메서드가 해당 어셈블리에서 보이지 않습니다. –

0

조립품에 따라 다릅니다. 이것은 아마도 (정적 링크의 일종에 있지만 그와 유사한) 일부 라이선스를 위반하고, 어쩌면 배포 악몽하게,하지만 당신은 고려할 수 수 :

  • 디 컴파일하고 자신의 프로젝트를 통해 코드를 복사;
  • 다시 컴파일/어셈블리를 패치 및 추가에 "InternalsVisibleToAttribute을"필요에 따라 수정
당신은 정말 클래스의 소유자 (내부로 표시 한 안 이후
관련 문제