Appeler des méthodes en ignorant la casse? c’est possible!
Je préfère le dire de suite, ce post à pour seul objectif de s’amuser en codant et il est fort peu probable de retrouver ces lignes de code en production 
Ca fait un bout de temps que je regarde la possibilité d’utiliser les classes dynamiques arrivés depuis C# 4 et franchement, mon esprit ne trouve que des exemples qui n’ont pas grand intérêt.
Du coup, j’en profite pour partager avec vous mes délires de programmeur du jeudi soir en vous montrant ce qu’il est possible de faire avec ces objets.
Un truc chiant lorsque l’on utilise des objets dynamic, c’est que l’on perd l’auto-completion, du coup on est sensible à la case…et ca devient vraiment pénible, je me suis alors demandé si il n’est pas possible de résoudre ce problème…et bien figurer vous que j’ai trouvé!
Je vous montre d’abord le résultat 
J’ai une classe Test qui implémente une UNIQUE méthode dummy:
1: public string DummyMethod()
2: {
3: return "Dummy!";
4: }
et j’exécute le code suivant:
1: Console.WriteLine(t.dummymethod());
2: Console.WriteLine(t.dummyMetHoD());
3: Console.ReadKey();
J’obtient le résultat suivant!

Comment j’ai fait? très simple, il suffit de jeter un œil sur la classe System.Dynamic.DynamicObject.
On y trouve entre autre les méthodes (aux nom explicites ) virtuelles suivantes:
- TryGetMember/TrySetMember
- TryInvoke
- TryInvokeMember
Pour rendre mes appelles case sensitive, il me suffit donc de modifier le code au moment ou il tente d’invoker un membre de ma classe:
1: public class Test: DynamicObject
2: {
3:
4: public string DummyMethod()
5: { return "Dummy!"; }
6:
7: public override bool TryInvokeMember(InvokeMemberBinder binder,
8: object[] args, out object result)
9: {
10:
11: bool retVal = false;
12: result = null;
13: string methodName = binder.Name;
14: var goodMethodInfo= this.GetType().GetMethods().
15: Where(m => m.Name.Equals(methodName,
16: StringComparison.CurrentCultureIgnoreCase)).
17: Single();
18:
19: if (goodMethodInfo!=null)
20: {
21: result = goodMethodInfo.Invoke(this, args);
22: retVal = true;
23: }
24: return retVal;
25: }
26:
27: }
Je récupère le nom de la méthode que je tente d’exécuter. Je cherche la méthode qui à le même nom (en ignorant la casse) que j’exécute dans la foulé et le tour est joué 
Bien sûr, ma classe hérite de DynamicObject et cela n’est pas forcément utile dans un projet réel…mais ca montre bien que derriere les dynamics, se cache pas mal de réflexions.
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 :