Я заметил, что ссылки на поля или методы в определенных типах методов (например, метод в универсальном типе) будут иметь тип FieldReference
, а не FieldDefinition
, хотя поле (или метод) находится в том же модуле, в том же типе. Как я могу получить FieldDefinition
из этого FieldReference
?
Я пробовал module.Import
и module.MetadataResolver.Resolve
, но оба не работают.
Ответ на этот вопрос, но более общий.
ИЗМЕНИТЬ:
Простой универсальный класс:
public class HelperClass<T>
{
private int _someInt;
void SomeMethod(int i)
{
_someInt = i;
}
}
Тело SomeMethod
содержит:
...
IL_0008: ldarg.0
IL_0009: ldarg.1
IL_000a: stfdl System.Int32 HelperClass`1<T>::_someInt
....
Обычно операнд кода операции IL_000a
должен быть FieldDefinition
, в конце концов, он находится в том же модуле. Но поскольку HelperClass
является общим, я полагаю, операндом является FieldReference
, который не разрешается, я могу просто надеяться сравнить полные имена, чтобы действительно найти FieldDefinition
.
В данном случае это не большая проблема, но когда ссылка относится к другим членам в других универсальных типах, я уверен, что есть лучший способ сделать это, чем перечисление всех типов, чтобы найти определение.
ИЗМЕНИТЬ:
HelperClass<>
из модуля, который загружается во время выполнения AssemblyDefinition.ReadAssembly
, когда .Resolve()
возвращает значение null вместо возврата FieldDefinition
.
ОБНОВЛЕНИЕ:
Оказалось, что из-за того, что я меняю имя поля в универсальном типе, ссылка ломается и Resolve()
возвращает null. Все еще ищите достойное решение для этого а>.
var myFieldDefinition = myFieldReference.Resolve();
) - person rileywhite   schedule 06.01.2015