다음은 (매우 단순화 된) 예제입니다.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). 그것은 아주 오래된 뉴스지만 당신이 그것에 대해 몰랐다면 ... 그것을 시도하십시오 :)
합니다. .. 그래서 당신은 그 타입을 계속해서 걷어차 야합니까? –