Black Friday = Pricewatch Bekijk onze selectie van de beste Black Friday-deals en voorkom een miskoop.
Toon posts:

[C#] Reflection - Properties van subclass ophalen

Pagina: 1
Acties:

Verwijderd

Topicstarter
Intro
Stel ik heb een twee classes: Persoon en Adres. Deze twee classes hebben een 1-op-1 relatie.

C#:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
public class Persoon
{
   public Persoon(){}

   public virtual string Naam
   {
      get ...
      set ...
   }

   public Adres PostAdres
   {
      get ...
      set ...
   }
}



C#:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
public class Adres
{
   public Adres(){}

   public virtual string Straat
   {
      get ...
      set ...
   }

   public string Postcode
   {
      get ...
      set ...
   }
}


Probleem
Stel ik heb het object Jan. Jan is een Persoon met een Adres. Ik wil middels reflection alle properties ophalen:

Jan.GetType().GetProperties()

Hiermee krijg ik netjes "Naam" en "PostAdres" terug, maar ik krijg niet de properties van het Adres terug. Ik wil dus ook "Straat" en "Postcode" krijgen.

Nou had ik gehoopt dat het volgende zou werken:

Jan.GetType().GetProperty("PostAdres").GetType().GetProperties()

Maar daarmee krijg ik niet de properties van het Adres te zien.

Vraag
Heeft iemand een idee hoe ik toch de properties van een subclass kan opvragen middels reflection?

  • Niemand_Anders
  • Registratie: Juli 2006
  • Laatst online: 09-07-2024

Niemand_Anders

Dat was ik niet..

Je kunt het beste de TypeDescriptor.GetProperties uit de System.ComponentModel namespace gebruiken.

C#:
1
2
3
4
5
6
7
Object o = new { Firstname = "S", Lastname="Shopper" };

PropertyDescriptorCollection props = TypeDescriptor.GetProperties(o);
foreach(PropertyDescriptor prop in props)
{
   Console.WriteLine("Property {0} has value {1}", prop.name, prop.GetValue(o));
}

Met SetValue kun je eventueel de waarde van een property zetten. De Descriptors vind ik persoonlijke fijner werken dan reflection.

GetValue geeft 'object' terug en dat kan dan ook 'Adres' zijn.
C#:
1
Adres a = props["PostAdres"].GetValue(o) as Adres;


Vervolgens kun je ook van adres weer de properties ophalen.

[ Voor 15% gewijzigd door Niemand_Anders op 31-07-2008 10:20 ]

If it isn't broken, fix it until it is..


  • FTL
  • Registratie: Maart 2000
  • Laatst online: 17-11 11:53

FTL

TypeDescriptor is niet altijd de beste oplossing voor een classe reflection, mocht hij geen methoden willen reflecten is het echter geen probleem.
The .NET Framework provides two ways to access metadata on a type: the reflection API provided in the System.Reflection namespace, and the TypeDescriptor class. Reflection is a general mechanism available to all types because its foundation is established in the GetType method of the root Object class. The information it returns for a type is not extensible, in that it cannot be modified after compilation of the target type. For more information, see the topics in Reflection.

In contrast, TypeDescriptor is an extensible inspection mechanism for components: those classes that implement the IComponent interface. Unlike reflection, it does not inspect for methods.
De echte oplossing met reflection is:
Met Jan.GetType().GetProperty("PostAdres") krijg je een PropertyInfo terug en niet de type zelf.
Dus een Jan.GetType().GetProperty("PostAdres").GetType().GetProperties() doe je een GetProperties op de type PropertyInfo.

Een oplossing zou zijn, de PropertyType is de 'return type' van deze property. Op deze kan je gerust GetProperties op aanroepen.
Jan.GetType().GetProperty("PostAdres").PropertyType.GetProperties()

[ Voor 73% gewijzigd door FTL op 31-07-2008 10:31 ]


  • 4of9
  • Registratie: Maart 2000
  • Laatst online: 13-12-2024
Je kunt toch gewoon Jan.Adres.Straat doen ? Daar heb je toch geen reflection voor nodig.

Aspirant Got Pappa Lid | De toekomst is niet meer wat het geweest is...


Verwijderd

Topicstarter
4of9 schreef op donderdag 31 juli 2008 @ 10:52:
Je kunt toch gewoon Jan.Adres.Straat doen ? Daar heb je toch geen reflection voor nodig.
Ik schrijf een stuk code voor een sorteermethode. Ik weet vantevoren niet welk objecttype er gesorteerd moet worden. Dus moet ik dat via reflection doen.

Verwijderd

Topicstarter
Ohja FTL, je voorbeeld werkt perfect zoals ik het wil.

Ik heb de oplossing van Niemand_Anders nog niet geprobeerd.
Pagina: 1