È possibile eseguire l'override di un metodo privato utilizzando Reflection in .NET 3.5?Sovrascrittura di un metodo privato con Reflection
risposta
Bene, sarebbe necessario essere virtual
per poterlo sovrascrivere (scrivendo un tipo dinamico che eredita dalla classe), e non si può avere un private virtual
(non ha senso). Potresti forse ignorare uno internal virtual
, ma sospetto che anche questo potrebbe avere problemi di sicurezza. Alla fine, direi di no.
Non utilizzando Reflection. È necessario utilizzare una sorta di AOP.
Non utilizzando Reflection da solo. Forse il meglio che puoi fare è usare Reflection, combinato con Reflection.Emit o CodeDom per duplicare la classe in un nuovo spazio dei nomi. Quando si incontra il metodo privato che si desidera sostituire, non lo si copia, si emette la sostituzione.
Tuttavia, ci sono molte tecniche che uno sviluppatore può utilizzare per rendere questa tecnica molto, molto più difficile. Rompere l'implementazione della classe in molte classi private o interne è una di queste.
Nota: utilizzando CodeDom, è necessario creare il grafico in memoria, compilarlo e quindi caricare l'assieme risultante.
Questo è probabilmente un MOLTO più problema di quello che vale.
L'altro modo per farlo sarebbe utilizzare Reflector per disassemblare la classe, prendere il codice e creare la propria classe da esso con il metodo replace. Ancora una volta ci sono significativi ostacoli tecnici e legali da superare. Tuttavia potresti imparare molto dal codice smontato.
Typemock Isolator si suppone che sia in grado di farlo, ma lo fa tramite .NET profiler APIs (secondo Roy Osherove in The Art of Unit Testing).
... o non si può imparare nulla, se il codice è offuscato. –
di si potrebbe imparare che un codice è offuscato :-) –