Преобразовать код C#

Мне нужно смоделировать в коде C# (с ilGenerator.Emit) следующую функцию

public void AssignAttribute(ref ValueHolder output, Assignment assignment) {
    ResultAttribute attribute = null;

    if ( (attribute = output.MultipleResults.Find(delegate(ResultAttribute o) {
        return o.Name == assignment.Name;
    })) != null)
        attribute.Value = assignment.Value;
    }

Кто-нибудь может мне помочь?

2 ответа

Нужно скомпилировать метод в проекте C#, а затем взглянуть на IL в сборке, которую он генерирует с использованием Reflector. Вы можете легко скопировать этот IL с помощью Emit и вносить любые необходимые динамические изменения.

C# создайте замыкание (см. википедию, если вы с ним не знакомы), поскольку в теле анонимного метода вы ссылаетесь на переменную присваивания (которая является параметром в вашем случае, но это не имеет значения).

Вам нужно создать держатель класса для анонимного делегата (по крайней мере, это делает компилятор C#)

тогда вам нужно создать поле в этом классе, так как ваш делегат закрывается (я не являюсь носителем английского языка, так что здесь возможно неправильное написание) Параметр назначения присваивания

Затем в теле AssignAttribute вы должны создать экземпляр класса IL_0000: экземпляр newobj void V24.Generated.Worker/'<>c__DisplayClass1'::. Ctor()

а также назначение поля IL_0008: класс stfld [nviss]NViss.Assignment V24.Generated.Worker/'<>c__DisplayClass1'::assignment

обратите внимание, что после завершения инициализации поля доступ к локальной переменной был заменен на доступ к полю

еще раз извините за мой английский

Другие вопросы по тегам