2010-06-18 11 views
2

Je dois implémenter une extension HtmlHelper dans mon projet MVC simplement pour sortir une chaîne mais UNIQUEMENT en mode DEBUG, pas en RELEASE. Ma première tentative serait:Problème d'extension MVC Helper

[Conditional("DEBUG")] 
public static string TestStringForDebugOnly(this HtmlHelper helper, string testString) 
{ 
    return testString; 
} 

Mais il est évident que donnerait une erreur de compilation:

"The Conditional attribute is not valid because its return type is not void."

Donc je crois comprendre une fois que vous définissez l'attribut [Conditional], il ne permet rien à retourner ? Pourquoi?

Existe-t-il une autre façon d'implémenter ce type de fonction? Toute aide serait très appréciée.

Répondre

6

Vous pouvez utiliser un preprocessor directive:

En ce qui concerne votre question initiale
public static string TestStringForDebugOnly(this HtmlHelper helper, string testString) 
{ 
#if DEBUG 
    return "debug"; 
#else 
    return "other"; 
#endif 
} 

la raison pour laquelle, un coup d'oeil à section 17.4.2 of the C# specification indique:

[A] conditional method must have a return type of void

Je ne peux que spéculer pourquoi les concepteurs de la langue a décidé cela, mais je suppose que c'est parce que le compilateur C# ne compile pas l'appel de méthode dans IL si la condition est false, donc en fait c'est comme si vous n'aviez jamais appelé la méthode lems à l'exécution si une valeur de retour était attendue!)

+0

parfait! Merci Monsieur. – BeCool

+0

+1 Pour savoir comment vous lisez l'esprit des concepteurs de langage. Je n'ai jamais compris comment les gens veulent faire ça. Peut-être que si je vieillis et plus sage ... –

+0

@Malcolm: L'esprit des concepteurs de la langue n'était pas la seule chose qu'il lisait ... –

1

Je ne sais pas si les concepteurs d'origine avaient cette ligne de pensée à l'esprit à l'origine, mais c'est comme cela que j'ai du sens. Parce que vous ne pouvez déclarer que la méthode comme type void ET qu'elle ne peut pas être surchargée ET qu'elle ne peut pas être référencée dans une interface, le compilateur peut simplement ignorer la méthode car elle n'aura pas de dépendances si le mode spécifié ne le fait pas rencontre. Si une autre méthode l'appelle dans un mode sans correspondance, le compilateur peut simplement traiter un appel de méthode non valide comme si l'attribut n'était pas là.

l'exemple de John fonctionnera, mais je ferais quelque chose comme ceci:

#if DEBUG 
public static string TestStringForDebugOnly(...) 
{ 
    ... 
} 
#endif 

// Arguments are only for illustration. 
public string CallingMethod(int id, string temp) 
{ 

    #if DEBUG 
    string result = TestStringForDebugOnly(id, temp); 
    #else 
    string result = TestString(id, temp); 
    #endif 

    return result; 
} 

Je dépenserait l'effort supplémentaire pour envelopper tout le code lié DEBUG (y compris les appels de méthode individuels) dans les directives de préprocesseur pour deux raisons. Premièrement, il fournit sa propre documentation intégrée; vous savez exactement ce qui est supposé courir quand, où et pourquoi. Deuxièmement, si le code doit être modifié ou supprimé, la quantité de recherche à effectuer est considérablement réduite, tout comme la nécessité de compiler et de recompiler à plusieurs reprises pour voir quelles sont les interruptions.