Voici une option qui reste aussi fidèle que possible à l'exigence de l'OP de pouvoir basculer sur le type. Si vous plissez assez fort les yeux, cela ressemble presque à une déclaration de commutation réelle.
Le code d'appel ressemble à ceci :
var @switch = this.Switch(new []
{
this.Case(x => { /* Code WebControl ici */ }),
this.Case(x => { /* Code TextBox ici */ }),
this.Case(x => { /* Code ComboBox ici */ }),
});
@switch(obj);
Le x
dans chaque lambda ci-dessus est fortement typé. Aucun cast nécessaire.
Et pour que cette magie fonctionne, vous avez besoin de ces deux méthodes :
private Action Switch(params Func[] tests)
{
return o =>
{
var @case = tests
.Select(f => f(o))
.FirstOrDefault(a => a != null);
if (@case != null)
{
@case();
}
};
}
private Func Case(Action action)
{
return o => o is T ? (Action)(() => action((T)o)) : (Action)null;
}
Cela fait presque venir les larmes aux yeux, n'est-ce pas ?
Néanmoins, ça fonctionne. Profitez-en.