Bienvenue à Blogs CodeS-SourceS Identification | Inscription | Aide

Actualités

  • Blog de Cyril DURAND, passionné de JavaScript, Ajax, ASP.net et tout ce qui touche au developpement Web Client-Side.

    View Cyril Durand's profile on LinkedIn

    hit counters

ConditionalAttribute : utiliser une méthode seulement en mode DEBUG

L'attribut ConditionalAttribute s'applique sur une méthode et permet de dire si cette méthode sera compilé ou non suivant des variables de compilation. 

Mais tout d'abord, qu'est-ce qu'une variable de compilation ? Ce sont des variables que l'on définit ou non lors de la compilation. Ce sont ces elles qui nous permettent de faire des instructions de précompilation.

#if DEBUG // ici du code de debug #endif

Pour définir ces variables, il faut aller dans les propriétés du projet :

Untitled

#if pouet var s = "pouet"; #endif #if toto var ss = "toto"; #endif

Pour ASP.net c'est un peu différent, il faut aller modifier le web.config et rajouter cette entrée :

<system.codedom> <compilers> <compiler language="c#;cs;csharp" extension=".cs" type="Microsoft.CSharp.CSharpCodeProvider, System, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" compilerOptions="/d:DEBUG,SANDBOX"/> </compilers> </system.codedom>

Comment l'attribut ConditionalAttribute fonctionne-t-il ? Pour cela prenons un exemple :

static void Main(string[] args) { var f = new Foo(); f.Bar(); } public class Foo { [Conditional("DEBUG")] public void Bar() { Console.WriteLine("toto"); } }

Si l'on compile ce programme en mode debug, alors le message "toto" sera affiché, par contre en mode Release, l'appel à la méthode Bar n'a tout simplement pas été compilé, le message "toto" ne sera pas affiché.

Quels sont les méthodes qui possèdent un tel attribut ? Voici une requête Linq qui permet de le savoir.

var q = from assembly in AppDomain.CurrentDomain.GetAssemblies() from type in assembly.GetTypes() from method in type.GetMethods(BindingFlags.Public | BindingFlags.Static | BindingFlags.Instance) where type.IsPublic && method.GetCustomAttributes(typeof(ConditionalAttribute), true).Length > 0 orderby ((ConditionalAttribute)(method.GetCustomAttributes(typeof(ConditionalAttribute), true))[0]).ConditionString descending select new { Type = type, Method = method, ConditionStrings = from c in method.GetCustomAttributes(typeof(ConditionalAttribute), true).Cast<ConditionalAttribute>() select c.ConditionString };

Cette requête retourne toutes les méthodes ayant l'attribut ConditionalAtttribute des assemblies actuellement chargés dans l'AppDomain courant.

Pour afficher le résultat de cette requête Linq, on peut utiliser du XLinq avec un HttpListener :

var listener = new HttpListener(); listener.Prefixes.Add("http://+:8080/"); listener.Start(); var browser = new Process(); browser.StartInfo.FileName = "iexplore.exe"; browser.StartInfo.Arguments = "http://localhost:8080/"; browser.Start(); var context = listener.GetContext(); context.Response.ContentType = "text/html"; using (XmlWriter writer = new XmlTextWriter(context.Response.OutputStream, Encoding.UTF8)) new XElement("html", new XElement("head", new XElement("title", "ConditionalAttribute") ), new XElement("body", new XElement("table", new XElement("tbody", from line in q select new XElement("tr", new XElement("td", new XElement("a", new XAttribute("href", String.Format("msdn2.microsoft.com/en-us/library/{0}.{1}", line.Type.FullName, line.Method.Name)), line.Type.FullName + ".", new XElement("strong", line.Method.Name) )), new XElement("td", String.Join(", ", line.ConditionStrings.ToArray())) ) ) ) ) ).WriteTo(writer);

Vous pouvez retrouver les sources du programme listant les différentes méthodes avec l'attribut ConditionalAttribute ici : ConsoleApplication2.zip

Posted: samedi 22 décembre 2007 14:59 par cyril
Attachment(s): ConsoleApplication2.zip
Ce post vous a plu ? Ajoutez le dans vos favoris pour ne pas perdre de temps à le retrouver le jour où vous en aurez besoin :

Commentaires

Pas de commentaires

Les commentaires anonymes sont désactivés

Les 10 derniers blogs postés

- un Pacman en Silverlight 2b2 par Pierrick's Blog le il y a 4 heures et 46 minutes

- Une table -> deux entity types sans colonne discriminante en base, gestion des relations par Matthieu MEZIL le il y a 12 heures et 44 minutes

- ssdl view et TPT par Matthieu MEZIL le 07-05-2008, 02:04

- L'injection SQL n'est PAS un problème QUE pour les développeurs web ! par CoqBlog le 07-05-2008, 01:08

- Un outil pour réaliser des animations WPF basées sur des équations de Bézier par Perspective le 07-04-2008, 21:45

- Sandcastle et CodePlex : le verdict par CoqBlog le 07-04-2008, 20:53

- ssdl view et TPH par Matthieu MEZIL le 07-04-2008, 19:12

- Webcasts sur le Parallel Framework disponibles par Matthieu MEZIL le 07-04-2008, 17:26

- [Silverlight] - Comprendre et Débuter avec Silverlight par Danuz le 07-04-2008, 12:41

- SharePoint : Nouvel article sur l'exportation et Importation de sites SharePoint par Blog Technique de Romelard Fabrice le 07-04-2008, 01:00