Забелязах, че препратките към поле или метод в определени типове методи (например метод в общ тип) ще бъдат от тип 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()
връща нула. Все още търсите прилично решение за това.
var myFieldDefinition = myFieldReference.Resolve();
) - person rileywhite   schedule 06.01.2015