Как я могу сгенерировать необходимый код IL для вызова метода System.Collections.Generic.EqualityComparer<T>.get_Default
с Mono Cecil?Вызов EqualityComparer.Default с Cecil
Я пробовал подобные варианты, но получал различные ошибки: от PEVerify, неспособного разрешить токен, а Сесил жаловался, что что-то из другого модуля и нужно импортировать, в ArgumentOutOfRangeException из самого Cecil.
Общий аргумент типа относится к PropertyType
свойства, которое я обрабатываю здесь.
PropertyDefinition propertyDef = ...;
var equalityComparer = typeDef.Module.ImportReference(typeof(System.Collections.Generic.EqualityComparer<>));
var equalityComparerInst = equalityComparer.MakeGenericInstanceType(propDef.PropertyType);
var getDefaultMethod = equalityComparerInst.Resolve().Methods.First(m => m.Name == "get_Default");
var getDefaultMethodRef = typeDef.Module.ImportReference(getDefaultMethod, getDefaultMethod);
il.Append(il.Create(OpCodes.Call, getDefaultMethodRef));
Какой код необходим для этого?
Общие экземпляры из других модулей всегда сложны.
Отлично, спасибо! Я почти пропустил строку 'methodRef.DeclaringType = importedGenericEq;', но, поскольку она все еще не работала для меня, я тоже нашел эту строку. – ygoe