Вот (очень упрощенный) пример:
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 написан в коде и скомпилирован. Мне нужно создать FinalClass во время выполнения с помощью Emit. Мне удалось испустить класс, как это обсуждается в Можно ли испустить тип, производный от универсального типа, указав себя в качестве параметра универсального типа? .
Проблема в том, что я не могу ссылаться на поле MyStaticField при генерации. Я пытался использовать TypeBuilder.GetField, но он не работает, так как мой тип все еще находится в стадии разработки, и он не был завершен. Я пытался использовать typeof (BaseClass <>). MakeGenericType (typeBuildOfFinalClass), но он не работает по той же причине.
Когда я пишу код вручную и декомпилирую, я вижу ссылку на BaseClass.MyStaticField, но я не могу найти способ его испустить. Я не знаю, как добраться до того FieldInfo, которое требуется для аргумента функции emit opcode.
Кто-нибудь знает, как я могу решить это?
Thx.
P.S. Для любого, кто использует emit ... вы можете найти это очень полезным (http://www.codeproject.com/KB/msil/emithelper.aspx). Это очень старые новости, но если вы не знали об этом ... попробуйте:)