Я использую Mono.Cecil для создания сборки, содержащей производный класс, который переопределяет определенный метод в импортированном базовом классе. Метод переопределения - это «неявное» переопределение. Проблема в том, что я не могу понять, как обозначить это как переопределение.
Я использую следующий код для создания метода переопределения.
void CreateMethodOverride(TypeDefinition targetType,
TypeDefinition baseClass, string methodName, MethodInfo methodInfo)
{
// locate the matching base class method, which may
// reside in a different module
MethodDefinition baseMethod = baseClass
.Methods.First(method => method.Name.Equals(methodName));
MethodDefinition newMethod = targetType.Copy(methodInfo);
newMethod.Name = baseMethod.Name;
newMethod.Attributes = baseMethod.Attributes;
newMethod.ImplAttributes = baseMethod.ImplAttributes;
newMethod.SemanticsAttributes = baseMethod.SemanticsAttributes;
targetType.Methods.Add(newMethod);
}
Насколько я понимаю, неявное переопределение должно иметь ту же сигнатуру, что и унаследованный метод.Используя приведенный выше код, когда я просматриваю результирующий метод в Reflector, методы базового класса и производного класса имеют одну и ту же сигнатуру, а именно «public virtual void f (int param)».
Я попытался удалить явный «виртуальный» атрибут, но потом производный метод оказался как «public void f (int param)».
Как мне получить у производного метода правильное «публичное переопределение» void f (int param) "подпись?
ПРИМЕЧАНИЕ. У меня есть метод расширения (" TypeDefinition.Copy "), который клонирует MethodInfo и возвращает MethodDefinition путем импорта всех ссылочных типов и т. д.