property - c# use attribute in method




Appliquer la décoration des attributs des classes/méthodes (4)

Suite à ma récente question sur les grands objets complexes en tant que résultat de service Web . J'ai réfléchi à la façon dont je peux m'assurer que toutes les futures classes enfants sont sérialisables en XML.

Maintenant, évidemment, je pourrais implémenter l'interface IXmlSerializable et y placer un lecteur / graveur, mais je voudrais éviter cela car cela signifie que je dois instancier un lecteur / graveur quand je veux le faire, et 99,99% du temps Je vais travailler avec une corde pour que je puisse écrire la mienne.

Cependant, pour sérialiser en XML, je décore simplement la classe et ses membres avec le Xml ??? attributs ( XmlRoot , XmlElement etc.), puis en passant le XmlSerializer et un StringWriter pour obtenir la chaîne. Ce qui est tout bon. J'ai l'intention de mettre la méthode pour retourner la chaîne dans une méthode générique d'utilité ainsi je ne dois pas m'inquiéter au type etc.

Ce qui me préoccupe est le suivant: Si je ne décore pas la ou les classe (s) avec les attributs requis, une erreur ne sera pas lancée avant l'exécution.

Existe-t-il un moyen d'appliquer la décoration d'attribut? Est-ce que cela peut être fait avec FxCop? (Je n'ai pas encore utilisé FxCop)

METTRE À JOUR:

Désolé pour le retard dans l'obtention de ce fermer les gars, beaucoup à faire!

Certainement l'idée d'utiliser la réflexion pour le faire dans un cas de test plutôt que de recourir à FxCop (comme pour tout garder ensemble) .. La réponse de Fredrik Kalseth était fantastique, merci d'avoir inclus le code car il m'aurait probablement fallu creuser pour comprendre comment le faire moi-même!

+1 aux autres gars pour les suggestions similaires :)


J'écrirais un test d'unité / d'intégration qui vérifie que toute classe correspondant à certains critères (ie sous-classe X) est décorée de manière appropriée. Si vous configurez votre build pour qu'il s'exécute avec des tests, vous pouvez faire échouer la génération lorsque ce test échoue.

MISE À JOUR: Vous avez dit: «On dirait que je vais devoir relever mes manches et m'assurer que les tests unitaires sont collectivement maintenus» - vous n'avez pas à le faire. Il suffit d'écrire une classe de test générale qui utilise la réflexion pour trouver toutes les classes qui doivent être affirmées. Quelque chose comme ça:

[TestClass]
public class When_type_inherits_MyObject
{
    private readonly List<Type> _types = new List<Type>();

    public When_type_inherits_MyObject()
    {
        // lets find all types that inherit from MyObject, directly or indirectly
        foreach(Type type in typeof(MyObject).Assembly.GetTypes())
        {
            if(type.IsClass && typeof(MyObject).IsAssignableFrom(type))
            {
                _types.Add(type);
            }
        }
    }

    [TestMethod]
    public void Properties_have_XmlElement_attribute
    {
        foreach(Type type in _types)
        {
            foreach(PropertyInfo property in type.GetProperties())
            {
                object[] attribs = property.GetCustomAttributes(typeof(XmlElementAttribute), false);
                Assert.IsTrue(attribs.Count > 0, "Missing XmlElementAttribute on property " + property.Name + " in type " + type.FullName);
            }
        }
    }
}

Une bonne règle FXCop (et dont j'ai besoin en ce moment) serait de vérifier que tous les objets qui sont ajoutés à la session ASP.NET ont l'attribut Serializable. J'essaie de passer de l'état de session InProc à SQL Server. La première fois que j'ai demandé une page, mon site a explosé sur moi parce que des objets non sérialisables étaient stockés dans Session. Puis vint la tâche de parcourir tout le code source à la recherche de chaque instance où un objet est défini dans la session ... FXCop serait une bonne solution. Quelque chose à travailler ...


Vous pouvez écrire une règle FxCop ou même vérifier les attributs en appelant GetType () dans le constructeur de la classe de base et en réfléchissant sur le type retourné.






.net-attributes