2010-11-08 27 views
0

Note: Je suis conscient que C# a des types anonymes et des types internes, mais ceux-ci remplissent des rôles nettement différents des classes internes java anonymes de l'ancien.Générateur de code pour créer des classes abstraites en ligne qui remplissent le rôle de classes internes java anonymes pour les interfaces C#?

Supposons que j'ai une interface:

public interface Foo<T> 
{ 
    int Fizz(string a); 
    T Buzz(object o); 
    void Crackle(); 
} 

Y at-il quelque chose là-bas (ReSharper macro ou similaire) qui me permettrait de générer une classe implémentant qui remplirait le rôle d'un style java AIC (c.-à- , permettez-moi de définir la fonctionnalité en ligne). à savoir

public class FooAIC<T> : Foo<T> 
{ 
    public Func<string, int> Fizz; 
    public Func<object, T> Buzz; 
    public Action Crackle; 

    int Foo<T>.Fizz(string a) 
    { 
     return Fizz(a); 
    } 

    T Foo<T>.Buzz(object o) 
    { 
     return Buzz(o); 
    } 

    void Foo<T>.Crackle() 
    { 
     Crackle(); 
    } 
} 

(je n'ai pas réfléchi à cela dans une grande quantité de détails. Je suppose que l'on pourrait créer une classe plus intelligent avec injection de membre en lecture seule, le contrôle nul sur appel, fonctionne pour les classes abstraites etc, mais cela devrait transmettre le général idée de ce que je veux atteindre)

Quelqu'un sait quelque chose qui peut le faire? Ou, à moins que cela, recommander la manière la plus sans douleur de regarder faire quelque chose comme ceci - serait-ce possible dans le moteur T4?

Répondre

1

Votre solution est correcte, typiquement dans .NET vous n'avez pas besoin de classes anonymes comme la plupart du temps vous ne pouvez que remplacer/implémenter une méthode sur eux, et pour cela vous avez des délégués (que je pense être beaucoup mieux choix). Mais si vous avez besoin de surcharger/implémenter plusieurs méthodes, créer une classe stub avec des délégués pour chaque méthode est le meilleur moyen. Dans WPF/Silverlight ICommand est implémenté de cette façon, vous avez une classe DelegateCommand qui reçoit un Func pour implémenter bool CanExecute (paramètre objet) et une action pour implémenter Execute (paramètre objet). La façon la plus correcte de le faire dans la génération de code est avec les templates T4, créer un template et un paramètre (par exemple une chaîne indiquant le nom de classe de la classe pour laquelle vous voulez créer une classe Delegateclass, et utiliser reflexion pour produire le code). Je souhaite aider