2011-10-28 2 views
2

다음은 (매우 단순화 된) 예제입니다.emit을 사용하여 서브 클래스를 생성 할 때 일반 기본 클래스에서 선언 된 정적 필드를 참조하는 방법은 무엇입니까?

public abstract class BaseClass<T> where T : BaseClass<T> 
{ 
    public static SomeOtherClass MyStaticField = new SomeOtherClass(typeof(BaseClass<T>)); 
} 

public sealed class FinalClass : BaseClass<FinalClass> 
{ 
    static FinalClass() 
    { 
     MyStaticField.SomeProperty = 123; 
    } 
} 

BaseClass는 코드로 작성되고 컴파일됩니다. Emit을 사용하여 런타임에 FinalClass를 만들어야합니다. 나는 그것이 Is it possible to emit a type deriving from a generic type while specifying itself as the generic type parameter?에서 토론되는 방법을 수업에서 방출 할 수 있었다.

문제는 방출 할 때 MyStaticField 필드를 참조 할 수 없다는 것입니다. TypeBuilder.GetField를 사용하려고했지만 내 형식이 "공사 중"이고 아직 완료되지 않았기 때문에 작동하지 않습니다. 내가 typeof (BaseClass <>)를 사용하여 시도했다. MakeGenericType (typeBuildOfFinalClass)하지만 그것은 같은 이유로 작동하지 않습니다.

코드를 수동으로 작성하고 디 컴파일하면 BaseClass.MyStaticField에 대한 참조가 표시되지만이를 방출 할 방법을 찾을 수 없습니다. 나는 인수를 opcode 함수 인수에 필요한 해당 FieldInfo 얻는 방법을 모르겠다.

아무도 내가 이것을 해결할 수있는 방법을 알고 있습니까?

Thx.

P.S. 누구든지 emit을 사용하면 ... 매우 유용 할 것입니다 (http://www.codeproject.com/KB/msil/emithelper.aspx). 그것은 아주 오래된 뉴스지만 당신이 그것에 대해 몰랐다면 ... 그것을 시도하십시오 :)

+0

합니다. .. 그래서 당신은 그 타입을 계속해서 걷어차 야합니까? –

답변

1

당신은 정적 TypeBuilder.GetField 방법을 사용할 필요가 : 당신이 기본 클래스를 지정했습니다 어떤 시점에서

var fieldInfo = TypeBuilder.GetField(typeof(BaseType<>).MakeGenericType(typeBuilderOfFinalClass), typeof(BaseType<>).GetField(...)) 
+0

TypeBuilder에도 정적 GetField 메서드가 있다는 것을 눈치 채지 못했습니다. 그것은 완벽하게 작동했습니다. 고마워. – user1018735