J'ai un certain code C# qui marche des schémas XML en utilisant les classes Xml.Schema du framework .NET. Les diverses restrictions de types simples sont extraites dans le cadre sous la forme d'un ensemble de classes dérivées de Xml.Schema.XmlSchemaFacet. À moins qu'il y ait quelque chose que j'ai manqué, la seule façon de savoir lequel des types de facettes dérivés est une facette donnée est de la projeter spéculativement à l'un d'entre eux, en attrapant le InvalidCastOperation résultant en cas d'échec. Cela me laisse avec une fonction vraiment laide comme ceci:Comment est-ce que je devrais refactoriser une longue chaîne d'opérations de moulage spéculatives enveloppées d'essai
private void NavigateFacet(XmlSchemaFacet facet)
{
try
{
handler.Length((XmlSchemaLengthFacet)facet);
}
catch(InvalidCastException)
{
try
{
handler.MinLength((XmlSchemaMinLengthFacet)facet);
}
catch(InvalidCastException)
{
try
{
handler.MaxLength((XmlSchemaMaxLengthFacet)facet);
}
catch(InvalidCastException)
{
...
}
}
}
}
Je suppose qu'il doit y avoir des façons plus élégantes de le faire; soit en utilisant une propriété que j'ai manqué dans le framework .NET, soit avec un truc astucieux de truquage OO. Quelqu'un peut-il m'éclairer?
J'apprécie vraiment le look de ceci. Je l'essaie dans mon code maintenant, je reviendrai à upvote après qu'il soit parti. –
Wow, merci encore pour ça, ça marche bien et le code est beaucoup plus propre maintenant. En outre, comme vous l'indiquez, le nouveau code s'exécute plus rapidement. Même si le nombre de tests unitaires dans le système a augmenté avec ce changement, le temps indiqué par NUnit a diminué de façon appréciable. Si je pouvais upvote plus d'une fois, je le ferais. :) –
+1 * beaucoup * mieux que toutes les autres réponses ici. C'est ce que j'espérais dans mon commentaire sur la réponse de Bevan. – MusiGenesis