2009-12-23 9 views
1

Je pensais à la façon dont Regex.Match.Group veut être dynamique:Comment écrire une méthode d'extension qui renvoie un objet dynamique?

Regex.Match (...).Groups["Foo"] 

aimerait être:

Regex.Match (...).Groups.Foo 

Je pensais à écrire une méthode d'extension qui permettrait:

Regex.Match (...).Groups().Foo 

Et essayé d'écrire de cette façon, mais ce n'est pas autorisé (';' d par 'dynamique statique')

public static dynamic DynamicGroups Groups(this Match match) 
{ 
    return new DynamicGroups(match.Groups); 
} 

public class DynamicGroups : DynamicObject 
{ 
    private readonly GroupCollection _groups; 

    public DynamicGroups(GroupCollection groups) 
    { 
     this._groups = groups; 
    } 
    public override bool TryGetMember(GetMemberBinder binder, out object result) 
    { 
     Group g = this._groups[binder.Name]; 

     if (g == null) 
     { 
      result = null; 
      return false; 
     } 
     else 
     { 
      result = g; 
      return true; 
     } 
    } 
} 

Toute façon d'y parvenir?

Il existe de nombreuses autres API qui ont été écrites avant dynamic qui pourraient être plus propres à utiliser de cette façon.

+0

Ceci est un bon exemple de dynamique est de ne pas obtenir près de tout code je contrôle. La seule chose que vous obtenez avec ceci est que vous avez quelque chose qui semble statiquement typé mais qui ne l'est pas. – erikkallen

+0

@erik: Une très réelle préoccupation. J'ai décidé de voir si c'était possible avant de voir si je l'ai aimé. Je pensais à appeler la méthode d'extension 'DynamicGroups()' pour le rendre clair. Qu'est-ce que tu penses? –

Répondre

8

Il y a juste une petite erreur dans votre code, modifiez dynamic DynamicGroups juste dynamic

public static dynamic Groups(this Match match) 
{ 
    return new DynamicGroups(match.Groups); 
} 
+0

Silly moi. Merci! –

Questions connexes