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:
- Overengineering
- Lunedì quiz 4–soluzione
- Lunedì quiz - risposte
- Refuctoring in C# 3.0
- Metodi dinamici di delegazione
Commenti (15):


Facebook,
Wikio,
Segnalo.

giovedì 28 luglio 2011 alle 12:46 AM -
http://pastebin.com/JRHg4m1U
Mi verrebbe da fare così...
Tento il bonus: stai scrivendo un compilatore?
Permalink - Rispondi al commento
giovedì 28 luglio 2011 alle 2:41 AM -
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.
Permalink - Rispondi al commento
giovedì 28 luglio 2011 alle 8:33 AM -
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...
Permalink - Rispondi al commento
giovedì 28 luglio 2011 alle 10:32 AM -
Sottoscrivo la modifica e il commento di EnricoC.
Bonus point: stai scrivendo qualcosa per potenziare/migliorare le API di Reflection.
Permalink - Rispondi al commento
giovedì 28 luglio 2011 alle 12:55 PM -
Il codice mi sembra ok quello modificato da EnricoC
BP: Stai scrivendo un ORM (ancora?)
Permalink - Rispondi al commento
giovedì 28 luglio 2011 alle 1:51 PM -
Con "mi sembra ok" intendo anche che non ho abbastanza voglia per pensare a come fare
Permalink - Rispondi al commento
giovedì 28 luglio 2011 alle 4:24 PM -
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.
Permalink - Rispondi al commento
giovedì 28 luglio 2011 alle 6:08 PM -
Tramite la classe Expression e la Static Reflection?
blogs.ugidotnet.org/.../pattern-model-view-view...
Permalink - Rispondi al commento
giovedì 28 luglio 2011 alle 6:15 PM -
Bravo Matteo, ora ci manca solo il codice che sostituisce la prima linea di cui sopra.
Permalink - Rispondi al commento
giovedì 28 luglio 2011 alle 6:16 PM -
Si possono usare le Expression, scendo dal treno metto mano ad una tastiera decente e lo scrivo
.m
Permalink - Rispondi al commento
giovedì 28 luglio 2011 alle 6:21 PM -
Ti riferisci alla "Static Reflection"? jagregory.com/.../
Permalink - Rispondi al commento
giovedì 28 luglio 2011 alle 6:25 PM -
...e si può fare parecchio anche SENZA Expressions:
http://ayende.com/blog/779/static-reflection
Permalink - Rispondi al commento
giovedì 28 luglio 2011 alle 9:06 PM -
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ù
Permalink - Rispondi al commento
venerdì 29 luglio 2011 alle 2:47 PM -
Cavoli che viaggioni mentali!
Permalink - Rispondi al commento
mercoledì 10 agosto 2011 alle 9:48 AM -
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); }
}
Permalink - Rispondi al commento