View Full Version : [C# 2.0]Come passo dinamicamente un <T> ?
RaouL_BennetH
10-11-2009, 15:41
Ciao a tutti :)
Mi sto scervellando per una cosa che forse è una stupidaggine;
supponendo di avere un metodo:
public IList GetAll<T>()
{
IList lista = manager.Prendi(typeof(T)).List();
return lista;
}
Supponendo che una stessa classe abbia più oggetti, per esempio:
private Pennello pennello;
private Vernice vernice;
etc..
Per evitare di dover chiamare quel metodo per ogni oggetto, come passo a
GetAll<T>() dinamicamente uno di quegli oggetti ?
!k-0t1c!
10-11-2009, 16:54
Quello che hai scritto è a dir poco confuso, comunque ogni genere di funzione "dinamica" in C# richiede l'uso di reflection nonostante i metodi generici.
Polimorfismo e uso dinamico sono cose molto diverse...
Ad ogni modo se vuoi aiuto prima cura meglio la formulazione del problema e rendila intelligibile ed univocamente interpretabile (la cosa ti aiuterà anche a chiarire cosa stai facendo, non solo a spiegarlo al mondo).
Edit: se lo scopo è chiamare GetAll su pennello, vernice etc, il modo più comodo sarebbe far derivare quelli da un'interfaccia comune ed in runtime usare la reflection per ottenere i valori dei fields con tipi che derivano dalla tua interfaccia. Non sono tuttavia sicuro che quel che ho ipotizzato che tu voglia fare sia quel che vuoi realmente fare.
!k-0t1c!, penso che l'eventuale parte in reflection sia gia' stata fatta nella manager.Prendi, quindi il problema dovrebbe essere piu' semplice.
Supponendo che appunto la manager.Prendi(typeof(Panino)).List()
ritorni una lista di Panini ma semplicmente non lo sappia (Ovvero ritorni una IList generica), allora farei
public IEnumerable<T> GetAll<T>()
{
foreach(T t in manager.Prendi(typeof(T)).List())
{
yield return t;
}
}
Supponendo che una stessa classe abbia più oggetti, per esempio:
private Pennello pennello;
private Vernice vernice;
etc..
Per evitare di dover chiamare quel metodo per ogni oggetto, come passo a
GetAll<T>() dinamicamente uno di quegli oggetti ?
Cosi':
...
List<Pennello> pennelli = new List<Pennello>(istanza.GetAll<Pennello>());
...
Con 3.5 questa parte sarebbe invece piu' semplicemente
...
var pennelli = istanza.GetAll<Pennello>().ToList();
RaouL_BennetH
11-11-2009, 12:55
>CUT<
Chiedo venia.
@gugoXX
Si, la parte di reflection infatti è già implementata (certe volte mi fai paura).
Con IEnumerable in effetti risolverei il problema :)
Grazie del prezioso suggerimento.
RaouL.
vBulletin® v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.