Nouveau (possible) Réponse
Je suis en mesure de reproduire ce problème si j'ai défini un type avec le même nom que l'un de l'ensemble « System.Web.Mvc.dll » dans ma propre bibliothèque. Serait-ce votre problème? Voir le code ci-dessous:
using System;
using System.Web.Mvc;
using System.Web.Routing;
namespace SystemWebMvcTest
{
// See here: I've declared a type with the same name as a type
// from the System.Web.Mvc namespace in System.Web.Mvc.dll.
public interface IController
{
}
public class IoCControllerFactory : DefaultControllerFactory
{
// Now this method signature, since it does not include the fullly
// qualified name of its return type, is actually defined to return
// an instance of the IController interface defined in THIS assembly,
// rather than the System.Web.Mcv.IController interface.
protected override IController GetControllerInstance(RequestContext requestContext, Type controllerType)
{
return null;
}
}
}
La même erreur doit se produire si vous avez un conflit de nom avec l'un des types pertinents: DefaultControllerFactory
, IController
, RequestContext
ou Type
.
Old réponse
La méthode originale est protected internal
, ce qui signifie qu'il est possible d'accéder par tout type au sein du même ensemble ainsi que tout type dérivé; mais vous essayez de la remplacer par une méthode qui est protected
, qui supprime l'accès à tous les types non dérivés, même dans le même ensemble que le type de base.
Ce n'est pas si différent d'essayer de remplacer un membre public
avec un private
. Tu ne peux pas faire ça. vous auriez à le déclarer dérivé new
au lieu de override
(ce qui est une idée assez mauvaise, presque tout le temps).
Mark votre méthode IoCControllerFactory.GetControllerInstance
protected internal
et vous devriez être bon.
MISE À JOUR: En fait, comme Thomas l'a souligné dans un commentaire, cela dépend totalement si votre type dérivé est dans le même assemblage que le type de base ou non. Si pas, déclarant le membre dérivé protected internal
aurait aucun sens. Si vous êtes dans un assemblage différent, je ne sais pas pourquoi déclarer le membre protected
provoque une erreur car c'est exactement ce que vous êtes censé faire.
MISE À JOUR 2:
Il semble que dans le code que vous avez posté, votre base et types dérivés sont dans le même ensemble. C'est pourquoi la méthode
IoCControllerFactory.GetControllerInstance
doit être marquée
protected internal
, pour correspondre à l'accessibilité de son type de base. Si vous étiez dans un ensemble séparé,
internal
aurait tort, car il ouvrirait l'accès à une nouvelle série de types (ceux dans ce nouvel ensemble).Si vous avez vu des exemples de code en ligne où un type dans un assembly a hérité un membre
protected internal
d'un type de base dans un autre, cela explique pourquoi le membre dérivé était seulement
protected
- pour que l'accessibilité reste la même.
MISE À JOUR 3: Peu importe! Apparemment, le type de base est dans un assembly .NET, ce qui est clairement différent de l'assemblage dans lequel se trouve votre type dérivé. Sur cette base, la signature de votre méthode devrait en fait être compilée telle quelle, pour autant que je sache. Une question dans mon esprit est si tous ces noms - DefaultControllerFactory
, IController
, RequestContext
, etc. - ne sont pas également présents dans votre assemblée. Si vous avez un conflit de noms, cela pourrait être une explication possible. Sinon, je ne comprends pas l'erreur du compilateur que vous obtenez.
Supprimer 'internal' de la signature de' GetControllerInstance'? Est-ce que ça marche? –
@Jason, cette méthode est définie dans l'assemblage ASP.NET MVC, vous ne pouvez pas le modifier –
voici une autre clé .... Si je déplace la classe à un autre assemblage, il fonctionne très bien. SI je l'enlève de mon assemblage d'origine, l'assemblage se construit !! Cela me bouscule vraiment. –