2009-09-14 4 views
4

는 다음 완벽하게 합법적 유형 계층 구조를 상상 :제네릭 형식 매개 변수로 자신을 지정하면서 제네릭 형식에서 파생 된 형식을 내보낼 수 있습니까?

내 질문이 <의 정적으로 컴파일 정의>는 동적으로 B 형을 방출 할 수 주어진
class A<T> where T : A<T> 
{ 
} 

class B : A<B> 
{ 
    public B():base(){} 
} 

?

문제는 ModuleBuilder.DefineType에 상위 유형을 지정하는 방법입니다.

아니면 많은 임시 파일을 생성하고 그것을에는 Csc.exe을 통과 같다 된 CodeDom (사용하여 상기 방법

  • 를 사용

    • 이외의 같은 종류를 생산하는 또 다른 방법이있다 : -))

    편집 : 는 유형 B은로부터 상속 된 기본 생성자 호출 명시 적 공공 기본 생성자가 있어야합니다.

    당신은 tbTypeBuilder입니다 typeof(A<>).MakeGenericType(tb) 같은 인수 뭔가를 사용하여 (재귀 유형에 부모를 설정 TypeBuilder.SetParent 방법을 사용하여 다음 부모 유형을 지정하지 않는 ModuleBuilder.DefineType의 과부하를 사용할 수 있습니다
  • +0

    [이 질문] 한 번 봐 (http://stackoverflow.com/questions/1348268/how-do-i-create-a-class-that-inherits-from-another-and-passes를 타고 -a-type-parameter-in). 나는 너에게 똑같은 문제가 있다고 생각한다. –

    답변

    4

    ,하지만 난 돈 내 앞에 C# 컴파일러가 없다).

    EDIT - 여기에 작업 예제가 있습니다. 여기에 ModuleBuilder mb이 있다고 가정합니다. 빈 기본 생성자의 경우 DefineConstructor 메서드를 전혀 사용할 필요가 없습니다. 또는 DefineDefaultConstructor을 사용할 수도 있습니다. 기본 생성자가 명시 적으로 호출되는 예제를 포함 시켰습니다. 추가 논리를 추가하려는 경우에 대비하십시오.

    TypeBuilder tb = mb.DefineType("B"); 
    Type AB = typeof(A<>).MakeGenericType(tb); 
    tb.SetParent(AB); 
    ConstructorInfo ctor = TypeBuilder.GetConstructor(AB, typeof(A<>).GetConstructor(new Type[] { })); 
    ILGenerator ilg = tb.DefineConstructor(MethodAttributes.Public, CallingConventions.Standard, new Type[] { }).GetILGenerator(); 
    ilg.Emit(OpCodes.Ldarg_0); 
    ilg.Emit(OpCodes.Call, ctor); 
    ilg.Emit(OpCodes.Ret); 
    Type t = tb.CreateType(); 
    
    +0

    여전히 문제가 있습니다. 기본 생성자를 생성 해보십시오. 물론 기본 생성자 기본 생성자를 호출해야합니다. – mark

    +0

    Do not Define (기본값) 생성자 메서드는 작동합니까? –

    +0

    DefineConstructor는 생성자의 코드를 내보내는 데 사용되는 ConstructorBuilder를 반환합니다. 코드 문 중 하나가 다음과 같이 기본 유형의 생성자 인 smth를 호출해야합니다. - ilg.Emit (OpCodes.Call, ctor); 여기서 ctor는 기본 유형의 생성자에 해당하는 기본 유형의 ConstructorInfo 인스턴스입니다. 문제는 ctor를 얻는 방법입니까? 나는 실패했다. – mark

    관련 문제