2010-08-20 1 views
1

나는 reflection.emit을 통해 빌드 된 동적 유형에서 파생하고자하는 일반 추상 기본 클래스를 사용합니다. 또한 일부 필드를 초기화하려면 파생 클래스 기본 생성자를 사용자 지정해야합니다. 파생 클래스의 기본 생성자를 올바르게 빌드하려면 기본 클래스의 기본 생성자를 가져 와서 호출해야합니다. 문제는 기본 클래스에서 기본 생성자를 가져올 수 없다는 것입니다.일반 추상 클래스의 기본 생성자 얻기

예 : 나는 모든 길이를 해봤

public abstract class Test<T> 
{ 
    private T data; 

    public abstract void Go(); 
} 

public class TestDerive : Test<int> 
{ 
    public override void Go() 
    { 
    } 
} 

class Program 
{ 
    static void Main(string[] args) 
    { 
     ConstructorInfo[] constructors = typeof(Test<>).GetConstructors(); 

     int length = constructors.Length; 
    } 
} 

은 항상 0입니다. 나는 이해하지 못한다. 리플렉터에서 비슷한 경우를 검사했고 실제로 추상 클래스의 기본 생성자를 호출합니다. 문제는 어떻게해야 동일한 문제를 해결할 수 있을까요?

답변

6

추상 클래스의 기본 생성자는 보호되어 있습니다. 리플렉션을 통해 액세스하려면 바인딩 플래그를 지정해야합니다. 당신은 (그것은 당신이 파생 유형에서보다 다른 생성자를 호출 할 수 없습니다로는, 공용 또는 물론, 정상적인 코드 보호 여부 실질적인 차이가 없습니다.)

typeof(Test<>).GetConstructors(BindingFlags.NonPublic | BindingFlags.Instance) 

을 사용할 수 있습니다

클래스가 제네릭인지 여부에 관계없이 문제입니다. 이는 문제의 원인이되는 추상성입니다.

+0

고마워요. 그게 다야. –