2010-08-17 5 views

답변

5

잠시 동안 어셈블리 2를 무시하십시오. public constructor가없는 B에서 상속하기 때문에 C 클래스의 인스턴스를 인스턴스화 할 수 없습니다.

그래서 C 클래스에서 상속 문제를 제거하면 보호 수준으로 인해 B 어셈블리 외부에서 B 클래스의 인스턴스를 만드는 데 여전히 문제가 있습니다. 하지만 리플렉션을 사용하여 B의 인스턴스를 만들 수 있습니다. ,이 일을

static void Main(string[] args) 
    { 
     System.Reflection.ConstructorInfo ci = typeof(B).GetConstructors(System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Instance)[0]; 
     B B_Object = (B)ci.Invoke(new object[]{"is reflection evil?"}); 

     Console.WriteLine(B_Object.PropSetByConstructor); 


     Console.ReadLine(); 
    } 

내가 권하고 싶지 않다 그 단지 나쁜 :

public class A 
{ 
    internal A(string s) 
    { 
     PropSetByConstructor = s; 
    } 

    public string PropSetByConstructor { get; set; } 
} 

public class B : A 
{ 
    internal B(string s) 
     : base(s) 
    { 
     PropSetByConstructor = "Set by B:" + s; 
    } 
} 

내가 다음 테스트 콘솔 응용 프로그램을 쓴 다음과 같이 테스트의 목적을 위해

, 나는 당신의 클래스를 변경 연습. 나는 모든면에서 예외가 있다고 생각합니다. 여기서 예외는 확장 할 수없는 제 3 자 라이브러리를 다루는 것일 수도 있습니다. 이렇게하면 상속하지 않으면 인스턴스화하고 디버그 할 수 있습니다.

2

리플렉션을 사용해도 가능하지 않습니다.

클래스에 액세스 가능한 생성자가없는 경우이를 상속하는 클래스를 만들 수있는 방법이 없습니다.

1

아니요, 아니요, AssemblyOne을 변경해야합니다.