Как ссылаться на статическое поле, объявленное в базовом базовом классе, при создании подкласса с помощью emit? - PullRequest
2 голосов
/ 28 октября 2011

Вот (очень упрощенный) пример:

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). Это очень старые новости, но если вы не знали об этом ... попробуйте:)

1 Ответ

1 голос
/ 28 октября 2011

Вам необходимо использовать статический TypeBuilder.GetField метод:

var fieldInfo = TypeBuilder.GetField(typeof(BaseType<>).MakeGenericType(typeBuilderOfFinalClass), typeof(BaseType<>).GetField(...))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...