Avatar billede stephanryer Nybegynder
16. juli 2009 - 14:08 Der er 2 kommentarer og
1 løsning

Reflection: Set value for private property

Jeg er ved at implementere min egen serialiserings/deserialiseringruting.

Jeg har lavet et object B, som er en baseklasse for alle de objekter, der skal kunne serialiseres.

Jeg har lavet en Attrbute, A, som alle klasser, der nedarver fra B, kan markere de af deres egne properties, som skal serialiseres.

Jeg har derefter lavet en generel serializerings-metode i baseklassen, B, som via reflection låber alle properties igennem og serialiserer alle properties markeret med attributten A.

Ved deserializering gennemløbes alle properties ligeledes og deserialiseres.

Min baseklasse B kan dog ikke sætte properties med private set-metoder. Ej heller properties placeret i klassen B selv.

Er der en workaround, så man kan sætte en værdi på en property med private set-metode?

På forhånd tak
Avatar billede bvli Praktikant
16. juli 2009 - 14:54 #1
Hej..

Jeg synes ikke jeg kan genskabe dit problem.

Nedenstående virker:

        class A : Attribute
        {
        }

        class B
        {
            private string x;
           
            [A]
            public virtual string X
            {
                get { return x;}
                private set{ x=value;}
            }
        }

        class C : B
        {
        }

        [Test]
        public void Testing()
        {
            Type t = typeof(B);
            B instance = new B();

            PropertyInfo[] properties = t.GetProperties(BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.Public);
            Assert.Greater(properties.Length, 0);
           
            PropertyInfo property = properties[0];
            Assert.Greater(property.GetCustomAttributes(typeof(A), true).Length, 0);

            property.SetValue(instance, "Testing", null);
            Assert.AreEqual("Testing", instance.X);

            instance = new C();
            properties = t.GetProperties(BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.Public);
            Assert.Greater(properties.Length, 0);

            property = properties[0];
            Assert.Greater(property.GetCustomAttributes(typeof(A), true).Length, 0);

            property.SetValue(instance, "Testing Again", null);
            Assert.AreEqual("Testing Again", instance.X);

        }
Avatar billede stephanryer Nybegynder
16. juli 2009 - 15:46 #2
Det er i din t.GetProperties du laver the magic.

Tusind tak :) Læg et svar.
Avatar billede bvli Praktikant
16. juli 2009 - 23:44 #3
Værsgo :)
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
IT-kurser om Microsoft 365, sikkerhed, personlig vækst, udvikling, digital markedsføring, grafisk design, SAP og forretningsanalyse.

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester