[C#][Reflection]Valorizzare una property di un oggetto conoscendo il n...

venerdì 12 giugno 2009 - 12.41

agentesmith Profilo | Newbie

Salve a tutti, è la prima volta che scrivo qui e vorrei prima presentarmi brevemente: sono Alessandro, 32 anni di cui gli ultimi 8 passati a scribacchiare codice. Tutti le mattine, in orari moooolto elastici, mi ritrovo in sella alla mia Bandita (Suzuki Bandit) con il portatile caricato nel bauletto, pronto ad affrontare nuovi (e vecchi) problemi. Odio il copia-incolla, preferisco inventare, ma visto che il tempo non è mai abbastanza...

Veniamo al problema, cercherò di metterlo in forma comprensibile (almeno spero)
Ho una classe
Automobile
. Al suo interno una proprietà (get:set)
motore
di tipo
Motore
, che a sua volta ha una proprietà (get:set)
testata
di tipo
Testata
e così via. Acquisisco in qualche modo un elenco piatto di coppie di stringhe (chiave, valore) tipo "Automobile.Motore.Testata.Materiale", "Alluminio", "Automobile.Motore.Testata.Colore", "Grigio" e così via.

Esiste la possibilità di istanziare un oggetto
auto
di tipo
Automobile
e riempirne i campi ciclando quella lista di coppie, invece di valorizzare uno ad uno le singole proprietà in modo tradizionale? (tipo:
auto.motore.testata.colore = "Grigio";
)?

Grazie a tutti,
Alex.

agentesmith Profilo | Newbie

Ho risolto il problema... lo pubblico per tutti:
immaginiamo, sulla scia dell'esempio precedente, di avere una lista con i nomi dei campi (tutti property) e sottocampi, qualcosa tipo:
"Automobile.Interni.Sedile.Colore", "Grigio". All'interno di questo ciclo, possiamo chiamare il metodo ricorsivo che segue;

private object SetRecursiveValue(object padre, string[] array, int index, string valore) { PropertyInfo prop = padre.GetType().GetProperty(array[index]); Object obj; // è l'ultimo caso: mi aspetto di agganciare la stringa all'oggetto immediatamente // precedente. if( index == (array.Length -1) ) { prop.SetValue(padre, valore, null); return null; } else { // per tutti gli altri casi obj = prop.PropertyType.GetConstructor(new Type[] { }).Invoke(new object[] { }); prop.SetValue(padre, obj, null); index++; return SetRecursiveValue(obj, array, index, finale); } }
laddove padre è un'istanza della classe Automobile, array è il risultato dello split della stringa "Automobile.Interni.Sedile.Colore", index è l'indice dell'array (che dal loop viene chiamato sempre con indice 0, l'indice incrementa nella ricorsione) e valore è l'oggetto stringa finale, "Grigio" per intenderci.
Spero che possa tornare utile anche a qualcun'altro.

Saluti a tutti.
Partecipa anche tu! Registrati!
Hai bisogno di aiuto ?
Perchè non ti registri subito?

Dopo esserti registrato potrai chiedere
aiuto sul nostro Forum oppure aiutare gli altri

Consulta le Stanze disponibili.

Registrati ora !
Copyright © dotNetHell.it 2002-2024
Running on Windows Server 2008 R2 Standard, SQL Server 2012 & ASP.NET 3.5