Je cherche des moyens d'améliorer la cohérence, la brièveté et la lisibilité de certains codes dans l'application sur laquelle je travaille. Le code de démarrage ressemblait à ceci:Méthode d'extension C# sur le type avec argument de type générique
context.GetGraphType<Bar>().Subscribe<Fizz>(
(instance, evt) => e.Execute((Bar)instance.Instance)
);
Il existe un certain nombre de lignes de code presque identiques comme ci-dessus. Je voulais réécrire à ressembler à quelque chose comme ceci:
typeof(Bar).SubscribeTo<Fizz>(context);
D'une part, cela me permettra de tirer profit de formaliser ce qui était déjà devenu une convention informelle. En outre, j'espérais que l'on lirait maintenant quelque chose comme "bar s'abonne à l'événement fizz sur le contexte donné", plutôt que "le contexte obtient le type de bar et souscrit à l'effervescence, puis fait quelques trucs." Je pense que le flux est mieux, et le collègue j'ai demandé à ce sujet d'accord.
J'ai commencé à implémenter cela comme une méthode d'extension. Afin d'accomplir ce qui précède, je voulais utiliser une classe de base générique abstraite pour le type d'événement, donc Fizz
serait Event<T>
. Cela signifierait que l'argument de type générique de la méthode d'extension devrait être contraint pour être du type auquel la méthode d'extension est appelée. Donc, pour l'exemple ci-dessus, Fizz
devrait être de type Event<Bar>
.
Est-ce possible? Je suis allé avec une solution alternative dans le même temps, mais je suis toujours curieux de savoir si cela peut être accompli. D'autres suggestions sont les bienvenues.
Merci! Éditer # 1: Pour être clair, je me rends compte que je pourrais utiliser un paramètre de type supplémentaire, mais je cherche des moyens d'éviter cela si possible.
Éditer # 2: Je pense que je vais aller avec une légère variation de la réponse acceptée, car elle ne correspond pas à 100% avec mon scénario. L'essentiel est qu'une classe statique générique peut être utilisée à la place d'une méthode d'extension de Type pour accomplir mon objectif. Merci dss539!
Code de mise à jour (il peut y avoir des fautes de frappe depuis que je fais ce à la volée):
public class Bar { }
public class Event<TSubscriber>
{
public abstract void Execute(TSubscriber source);
}
public class Fizz : Event<Bar>
{
public override void Execute(Bar bar)
{
// respond to event
}
}
public class Context { }
public static class ForType<TSubscriber>
{
public static void SubscribeTo<TEvent>(Context context)
where TEvent : Event<TSubscriber>
{
context.GetType<TSubscriber>().Subscribe<TEvent>(
(evt, args) => evt.Execute((TSubscriber)args.Source));
}
}
public static void Run()
{
ForType<Bar>.SubscribeTo<Fizz>(context);
}
Je ne comprends pas très bien votre question. À quoi ressemble votre signature de méthode existante? 'S'abonner (ce type de type, action )'? Si vous montrez ce que vous avez (ou l'équivalent), cela peut aider à expliquer. –
dss539
Je pense avoir eu un problème de conception similaire il y a quelque temps. Bonne chance :) – leppie
@ dss539 Ce serait plus comme S'abonner (ce Type de type, Contexte ctx). Le problème est qu'il n'y a aucun moyen (que je connaisse) de contraindre T à être de type Event . –