Vra

Na aanleiding van my onlangse vraag oor groot, komplekse voorwerpe as 'n web Service Resultaat . Ek het gedink oor hoe ek kan verseker dat alle toekomstige kind klasse is serialiseerbaar om XML.

Nou, natuurlik het ek kon implementeer die IXmlSerializable koppelvlak en dan gooi 'n leser / skrywer om dit maar ek sou graag wou vermy dat aangesien dit dan beteken dat ek nodig het om 'n leser / skrywer instansieer wanneer ek wil om dit te doen, en 99,99% van die tyd gaan ek wees saam met 'n string so kan net skryf ek my eie.

Maar om afleveringen om XML, ek eenvoudig versier die klas en sy lede met die Xml ??? kenmerke ( XmlRoot , XmlElement ens) en dan om dit na die XmlSerializer en 'n StringWriter om die string te kry. Wat is alles goed. Ek is van plan om die metode te maak aan die string terug te trek na 'n generiese nut metode, sodat ek nie hoef te bekommer oor tipe ens.

Die hierdie wat my betref, is dit:. As ek nie versier die klas (se) met die vereiste eienskappe 'n fout is nie gegooi totdat run tyd

Is daar enige manier om kenmerk versiering af te dwing? Kan dit gedoen word met FxCop? (Ek het nie gebruik FxCop nog)

UPDATE:

Jammer vir die vertraging in om hierdie noue af ouens, baie om te doen!

Beslis hou van die idee van die gebruik van refleksie om dit te doen in 'n toetssaak eerder as op te stel FxCop (graag alles bymekaar te hou) .. Fredrik Kalseth se antwoord was fantasties, dankie vir die insluiting van die kode soos dit waarskynlik sou my 'n bietjie van die grawe geneem om uit te vind hoe om dit self te doen!

1 na die ander ouens vir soortgelyke voorstelle:)

Was dit nuttig?

Oplossing

Ek sal 'n eenheid / integrasie toets wat verifieer dat enige klas wat ooreenstem met 'n paar kriteria wat gegee is (dit wil sê subclassing X) toepaslik is versier skryf. As jy die opstel van jou bou om te hardloop met toetse, kan jy die opbou misluk wanneer hierdie toets druip.

UPDATE: Jy het gesê, "Dit lyk asof ek sal maar net moet my moue op te rol en maak seker dat die eenheid toetse gesamentlik in stand gehou word" - jy hoef nie te. skryf net 'n algemene toets klas wat besinning gebruik om alle klasse wat aangespreek moet word beweer vind. Iets soos hierdie:

[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);
            }
        }
    }
}

Ander wenke

Jy kan eenheid toetse te skryf om te kyk vir hierdie soort van ding -. Dit basies gebruik weerspieëling

Gegewe die feit is dit moontlik ek dink dit sou ook moontlik om 'n FxCop reël te skryf nie, maar ek het nog nooit so iets gedoen nie.

Jy kan 'n FxCop reël te skryf of selfs gaan vir die eienskappe van 'n beroep getSoort () in constructor die basis klas en weerspieël oor die teruggekeer tipe.

'n Goeie FXCop reël (en een wat ek vind ek nou nodig het) sou wees om seker te maak dat al die voorwerpe wat word bygevoeg aan die ASP.NET Sessie het die serialiseerbaar kenmerk. Ek probeer om te beweeg van InProc sessie staat om SQL Server. Eerste keer dat ek versoek om 'n bladsy, my site opgeblaas op my, want nie-serialiseerbaar voorwerpe is gestoor in sessie. Toe kom die taak van jag deur middel van al die bronkode op soek na elke geval waar 'n voorwerp is ingestel in die Sessie ... FXCop sou 'n lekker oplossing wees. Iets om te werk ...

Jy kan ook hierdie konsep / post-verwerker gebruik om verhoudings tussen eienskappe af te dwing en gebruik soortgelyke Teken in op verhoudings tussen klasse af te dwing en eienskappe tydens kompilering:

http :? //www.st.informatik.tu-darmstadt.de/database/publications/data/cepa-mezini-gpce04.pdf id = 92

Gelisensieer onder: CC-BY-SA met toeskrywing
Nie verbonde aan StackOverflow
scroll top