Преобразовать код 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
обратите внимание, что после завершения инициализации поля доступ к локальной переменной был заменен на доступ к полю
еще раз извините за мой английский