Avatar billede KOH Novice
20. juli 2014 - 08:53 Der er 8 kommentarer og
1 løsning

Reflection - hent værdier fra nested class/properties

Hejsa

Jeg prøver at finde frem til en metode hvorpå jeg kan laven en list.orderby(x => x.parameter)

orderby skal kunne angives som en string, det virker fint med denne metode

PropertyInfo pi = typeof(person).GetProperty(propertyName);
personSorted = persons.OrderBy(x => pi.GetValue(x,null)).ToList();

men det virker KUN på properties som er på første level i en class, det jeg så mangler er at kunne få adgang til properties fra den nested classes som f.eks, nedenstående class hvor person indeholder klassen adresseInfo - så hvordan får jeg fat i de properties, så de kan bruges i min orderby - det skal være reflection da jeg skal kunne angive orderby som udfra en string variabel i databasen.

public class person
    {
        public person()
        {
            addressInfo = new address();
        }

        public string firstname { get; set; }
        public string lastname { get; set; }

        public address addressInfo;
    }

    public class address
    {
        public string city { get; set; }
        public int postalcode { get; set; }
    }
Avatar billede arne_v Ekspert
20. juli 2014 - 15:23 #1
Det maa vel blive noget a la:

pi2.GetValue(pi1.GetValue(x, null), null)

Jeg kan godt proeve og bixe et eksempel hvis noedvendigt.
Avatar billede KOH Novice
20. juli 2014 - 16:37 #2
Hej Arne

Du må meget gerne komme med et eksempel, synes jeg er løbet panden imod muren med dette problem.

// Kim
Avatar billede arne_v Ekspert
20. juli 2014 - 17:28 #3
Muligvis er det fordi din address er et field og ikke en property at det driller lidt!
Avatar billede arne_v Ekspert
20. juli 2014 - 17:29 #4
Det her virker:

using System;
using System.Reflection;

namespace E
{
    public class Person
    {
        public string FirstName { get; set; }
        public string LastName { get; set; }
        public Address Address { get; set; }
    }

    public class Address
    {
        public string City { get; set; }
        public int ZipCode { get; set; }
    }
    public class Program
    {
        public static void Main(string[] args)
        {
            Person o = new Person { FirstName = "Oscar", LastName = "Mayer", Address = new Address { City = "Somewhere", ZipCode = 1234 } };
            PropertyInfo pi1 = typeof(Person).GetProperty("Address");
            PropertyInfo pi2 = typeof(Address).GetProperty("City");
            String city = (string)pi2.GetValue(pi1.GetValue(o, null), null);
            Console.WriteLine(city);
            Console.ReadKey();
        }
    }
}
Avatar billede KOH Novice
20. juli 2014 - 18:49 #5
Hej Arne

Tak for eksempel - det virker fint, men løser ikke helt mit problem - jeg har en list af type Person

Denne vil jeg så sortere ved hjælp orderby funktionen på list -
Person.OrderBy(x => pi1.GetValue(x, null)).ToList()

men problemet er at jeg ikke kan angive pi2 da den stammer fra en anden type, så hvordan kan jeg angive i orderby at den skal via pi1 hvis man kan sige det sådan i teorien hedder den jo 'Person.Address'
det går fint med properties tilhørende direkte på person klassen
Avatar billede KOH Novice
20. juli 2014 - 18:57 #6
Hmm - var nok lidt for hurtig her, det stod jo i eksemplet
men der hvor jeg har skrevet MANGLER hvad skal jeg skrive her?

List<person> personSorted = new List<person>();

personSorted = persons.OrderBy(x => pi2.GetValue(pi1.GetValue(MANGLER, null), null)).ToList();
Avatar billede KOH Novice
20. juli 2014 - 18:59 #7
Så kan jeg lære det, det skal jo være x ;-) selvfølgelig
Avatar billede KOH Novice
20. juli 2014 - 19:00 #8
Hej Arne

Smid et svar, så du kan få point - mange tak for din hjælp det giver jo god mening når man ser løsningen, tusind tak.
Avatar billede arne_v Ekspert
20. juli 2014 - 19:21 #9
svar

:-)
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

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