Używam Mono.Cecil do generowania zespołu, który zawiera klasy pochodnej, który przesłonił określonej metody w zaimportowanej klasie bazowej. Metoda przesłaniania jest "niejawnym" nadpisaniem. Problem polega na tym, że nie potrafię określić, jak to nazwać nadpisaniem.Jak utworzyć metodę zastępowania przy użyciu Mono.Cecil?
Korzystam z następującego kodu, aby utworzyć metodę zastępowania.
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);
}
Rozumiem, że domniemane przesłanianie musi mieć ten sam podpis co metoda odziedziczona. Korzystając z powyższego kodu, gdy wyświetlam wynikową metodę w Reflectorze, klasa bazowa i metody klasy pochodnej mają dokładnie tę samą sygnaturę, a mianowicie "publiczny wirtualny void f (int param)".
Próbowałem usunięcie wyraźny „wirtualny” atrybut, ale to metoda pochodzi kończy się jako „public void f (int param)”.
Jak mogę uzyskać metoda pochodzi mieć prawidłowy” override void f (int param)”podpis
UWAGA: mam metodę rozszerzenia («TypeDefinition.Copy»), które klonów MethodInfo i zwraca MethodDefinition poprzez importowanie wszystkich przywoływanych typów itd
Dzięki za info - dokładnie to, co potrzebne. Z jakiegoś powodu nie otrzymałem powiadomienia e-mail od SO lub grupy Mono-Cecil. Przepraszamy za pytanie przez wiele kanałów! –
Bez problemu, cieszymy się, że znaleźliśmy rozwiązanie Twojego problemu! –