Estoy usando Mono.Cecil para generar un ensamblado que contiene una clase derivada que anula un método específico en una clase base importada. El método de anulación es una anulación "implícita". El problema es que no puedo encontrar la manera de designarlo como una anulación.¿Cómo crear un método de anulación usando Mono.Cecil?
Estoy usando el siguiente código para crear el método de anulación.
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);
}
Tengo entendido que una anulación implícita debe tener la misma firma que el método heredado. Usando el código anterior, cuando veo el método resultante en Reflector, la clase base y los métodos de clase derivados tienen exactamente la misma firma, a saber, "void virtual público f (int param)".
He intentado quitar el atributo explícito "virtual", pero entonces el método derivado termina como "(int param)'.
¿Cómo puedo obtener el método derivado de tener la correcta public void f" public override void f (int param)" firma
NOTA:? tengo un método de extensión ("TypeDefinition.Copy") que se clona un MethodInfo y devuelve un MethodDefinition mediante la importación de todos los tipos de referencia, etc.
Gracias por la info - exactamente lo que necesitaba. Por alguna razón, no recibí una notificación por correo electrónico de SO o del grupo Mono-Cecil. Lo siento por preguntar a través de múltiples canales! –
¡No hay problema, nos alegramos de haber encontrado una solución a su problema! –