Bienvenue à Blogs CodeS-SourceS Identification | Inscription | Aide

Fathi Bellahcene

.Net m'a tuer!
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 Sourire

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 Sourire

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!
image

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é Sourire

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 :
Posted: jeudi 17 mars 2011 23:11 par fathi
Classé sous : ,

Commentaires

MisterG a dit :

Bonjour,

Je crois qu'on dit la casse et pas la case.

# mars 18, 2011 09:16

fathi a dit :

merci!

# mars 18, 2011 10:00
Les commentaires anonymes sont désactivés

Les 10 derniers blogs postés

- Simuler facilement l’envoi de mail par Blog de Jérémy Jeanson le 05-22-2013, 12:52

- ProcDump 6.0 : support du filtrage sur messages d'exceptions .NET, des filtres multiples et du ciblage par nom de service par CoqBlog le 05-20-2013, 14:50

- Votez pour le TOP 10 des influenceurs SharePoint francophones ! par Le blog de Patrick [MVP SharePoint] le 05-20-2013, 12:59

- [Conf’SharePoint] Dernier rappel ! :-) par Le blog de Patrick [MVP SharePoint] le 05-20-2013, 09:09

- [ #SharePoint 2013 ] les modèles de sites standards… par Le blog de Patrick [MVP SharePoint] le 05-20-2013, 09:03

- 10 erreurs de compréhension concernant SharePoint… par Le blog de Patrick [MVP SharePoint] le 05-20-2013, 08:27

- Conf’SharePoint : 10 bonnes raisons pour ne pas la rater par Le petit blog de Pierre / Pierre's little blog le 05-14-2013, 02:24

- [Event] Soirée de lancement Agile .NET France à Lyon par Blog Agile/ALM de Vincent THAVONEKHAM le 05-13-2013, 01:29

- .NET / Debug : inspection de la mémoire d'applications .NET (dump ou processus live) : première livraison d'une librairie .NET par Microsoft par CoqBlog le 05-11-2013, 22:21

- SharePoint : Incompatibilité avec Internet Explorer 10 (IE10) par Blog Technique de Romelard Fabrice le 05-08-2013, 16:29