Info:

twitter

Ultimi commenti: Comment feed

Tags:

Sponsor:

Archivio 2018:

Gen

Archivio 2017:

Dic Nov Ott Mag Apr Mar Feb Gen

Archivio 2016:

Dic Nov Ott Ago Mag Mar Feb Gen

Archivio 2015:

Nov Ott Set Mar Gen

Archivio 2014:

Dic Nov Ott Set Lug Giu Mag Apr Gen

Archivio 2013:

Dic Nov Set Ago Lug Giu Mag Apr Feb Gen

Archivio 2012:

Dic Nov Ott Set Ago Giu Mag Apr Mar Feb Gen

Archivio 2011:

Dic Nov Ott Set Ago Lug Giu Mag Apr Mar Feb Gen

Archivio 2010:

Dic Nov Ott Set Ago Lug Giu Mag Apr Mar Feb Gen

Archivio 2009:

Dic Nov Ott Set Ago Lug Giu Mag Apr Mar Feb Gen

Archivio 2008:

Dic Nov Ott Set Ago Lug Giu Mag Apr Mar Feb Gen

Archivio 2007:

Dic Nov Ott Set Ago Lug Giu Mag Apr Mar Feb Gen

Archivio 2006:

Dic Nov Ott Set Ago Lug Giu Mag Apr Mar Feb Gen

Quiz riflessivo per programmatori C#

Data una classe X_Class ed una proprietà Y_Property di tipo Zeta:

        class X_Class

        {

            public Zeta Y_Property { get; set; }

        }

ricavare il nome della proprietà sotto forma di stringa in maniera programmatica (hint: usare la versione 4.x del Framework).

BONUS POINT: L’esercizio ha anche un suo perché, stabilire quale.

Soluzione:

public static string YPropToString()

{

    return ((MemberExpression)
     ((Expression<Func<X_Class, object>>)
       ((o) => o.Y_Property)).Body).Member.Name;

}

Probabilmente si può fare di meglio. Lo scopo, come spiegato nei link dei commenti, è di fare in modo che il codice non compili se viene rinominata una proprietà

-quack

Potrebbero interessarti anche:
Commenti (15):
1. Phenix
giovedì 28 luglio 2011 alle 12:46 AM - IE 9.0 Windows 7
   

http://pastebin.com/JRHg4m1U

Mi verrebbe da fare così...

Tento il bonus: stai scrivendo un compilatore?

 

 

   
2. Paperino
giovedì 28 luglio 2011 alle 2:41 AM - IE 9.0 Windows 7
   

Nella riga numero 10. stai usando una stringa per recuperare il nome della classe (potresti fare typeof(X_Class)). Ma il problema più grosso è che il metodo non funziona se ci sono più proprietà dello stesso tipo.

Es:

X_Class
{
   Zeta Y_Property;
   Zeta W_Property;
}

e non sto scrivendo un compilatore.

   
3. EnricoC.
giovedì 28 luglio 2011 alle 8:33 AM - chrome 12.0.742.122 Windows 7
   

Credo di non afferrare. Se quello che vuoi e' il nome di una property di tipo Zeta nella classe X_Class il codice moddato e' questo:

http://pastebin.com/GJtD4N1k

Poi tu dici "non funziona perche' potrebbero esserci piu' property di tipo Zeta" (come nel codice che ti ho linkato derivante dall'esempio che hai fatto). In quel caso allora mi devi dire quale property vuoi, in che modo potrei estrarti una property fra le tante in modo programmatico se non so a priori il nome? Un conto e' se so che la property contiene la lettera Y, in quel caso si riesce facilmente a discriminare...

   
4. Phenix
giovedì 28 luglio 2011 alle 10:32 AM - IE 9.0 Windows 7
   

Sottoscrivo la modifica e il commento di EnricoC.

Bonus point: stai scrivendo qualcosa per potenziare/migliorare le API di Reflection.

   
5. Emanuele
giovedì 28 luglio 2011 alle 12:55 PM - IE 9.0 Windows 7
   

Il codice mi sembra ok quello modificato da EnricoC

BP: Stai scrivendo un ORM (ancora?)

   
6. Emanuele
giovedì 28 luglio 2011 alle 1:51 PM - IE 9.0 Windows 7
   

Con "mi sembra ok" intendo anche che non ho abbastanza voglia per pensare a come fare

   
7. Paperino
giovedì 28 luglio 2011 alle 4:24 PM - chrome 12.0.742.122 Windows 7
   

Mi rendo conto che partire da una risposta rende molto difficile fare la domanda. Cominciamo dal bonus point: quando si scrive questo pezzo di codice qui sotto

var pName = typeof( X_Class ).GetProperty("Y_Property").Name;
Console.WriteLine(pName); 

si corre il rischio che se qualcuno rinomina Y_Property in YY_Property usando il wizard di VS "rename" finisca per rompere il codice di cui sopra.

Obiettivo: riscrivere la prima linea in modo che sia modificata automagicamente da VS. Non so se ho spiegato bene la mia farneticazione.

   
8. Matteo
giovedì 28 luglio 2011 alle 6:08 PM - firefox 5.0 Windows 7
   

Tramite la classe Expression e la Static Reflection?

blogs.ugidotnet.org/.../pattern-model-view-view...

   
9. Paperino
giovedì 28 luglio 2011 alle 6:15 PM - chrome 12.0.742.122 Windows 7
   

Bravo Matteo, ora ci manca solo il codice che sostituisce la prima linea di cui sopra.

   
10. mauro servienti
giovedì 28 luglio 2011 alle 6:16 PM - IE 9.0 unknown
   

Si possono usare le Expression, scendo dal treno metto mano ad una tastiera decente e lo scrivo

.m

   
11. Marco Amendola
giovedì 28 luglio 2011 alle 6:21 PM - chrome 12.0.742.122 Windows 7
   

Ti riferisci alla "Static Reflection"? jagregory.com/.../


   
12. Marco Amendola
giovedì 28 luglio 2011 alle 6:25 PM - chrome 12.0.742.122 Windows 7
   

...e si può fare parecchio anche SENZA Expressions: 
http://ayende.com/blog/779/static-reflection

   
13. Paperino
giovedì 28 luglio 2011 alle 9:06 PM - IE 9.0 Windows 7
   

Yes guys, mi sorprende però il fatto che la tecnica Zen che ho imparato da solo ha pure un nome. Azz, devo leggere di più

   
14. Phenix
venerdì 29 luglio 2011 alle 2:47 PM - chrome 13.0.767.1 Windows XP
   

Cavoli che viaggioni mentali!

   
15. Gian Maria
mercoledì 10 agosto 2011 alle 9:48 AM - IE 9.0 Windows 7
   

LA static reflection è la manna dal cielo io ho le proprietà degli oggetti implementate cosi

    publicString Name

        {

           

get { return Get(() => Name); }

           

set { Set(() => Name, value); }

        }  

 

   
Lascia un commento:
Commento: (clicca su questo link per gli smiley supportati; regole di ingaggio per i commenti)
(opzionale, per il Gravatar)