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 :
#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