Newsgroup: it.comp.dotnet
Titolo: Cast da tipo a tipo generico

Ciao, ho scritto una cosa del genere
 
public abstract class Parametro
{
 
}
public class Parametro<T> : Parametro
{
public T Valore { get; set; }
}
 
private Dictionary<string, Parametro> parametri = 
				new Dictionary<string, Parametro>();
 
parametri.Add("001",new Parametro<string>());
parametri.Add("002",new Parametro<Decimal>());
 
Per cui riesco a mettere dentro il dictionary i vari Parametro<T>.
Però una volta che faccio questo
 
foreach (KeyValuePair<string, Parametro> kvp in Parametri)
{
}
 
vorrei poter estrarre (cast) da kvp (Parametro) il relativo Parametro<T>. Come posso fare ?
Grazie
Stefano

 Come posso fare ?
 
diciamo che non puoi :-)
perchï¿œ o conosci il tipo T staticamente oppure in tutti i casi ti 
ritrovi on un boxing verso object per le maani e/o devi andare via 
reflection.
 
Puoi fare un esempio d'uso di quello che hai scritto per capire se ci 
sono alternative?
 
ho una situazione identica in una classe base, ma le classi derivate 
conoscono il tipo T quindi il problema li non si pone.
 
.m
 
-- 
blog @ //
milestone.topics.it
 
 
 

Ciao Mauro,
grazie per la risposta.... temevo, infatti non ho trovato nulla, ma a volte si fanno le domande sbagliate a Google (specie se in inglese ;-)
 
in pratica quando setto Parametro<T>.Valore lo faccio dentro uno proprietà che mi wrappa parametro<T> per cui T lo consosco e lì non ho problemi.
Il problema nasce in una classe Parser, che rivece una stringa e la parsa appunto per ogni Parametro del dictionary e poi deve scrivere dentro Parametro<T>.Valore.
io adesso ho scritto una cosa del genere
 
foreach (KeyValuePair<string, Parametro> kvp in Parametri)
                {
                Type Tipo = kvp.Value.GetType().GetGenericArguments()[0];
 
                if (Tipo.IsGenericType && Tipo.GetGenericTypeDefinition() == typeof(Nullable<>))
                    {
                    Tipo = Nullable.GetUnderlyingType(Tipo);
                    }
 
                dynamic obj = kvp.Value;
 
 
                switch (Tipo.Name.ToUpper())
                    {
                    case "STRING":
                        obj.Valore = ret[counter];
                        break;
                    case "DECIMAL":
                        obj.Valore = decimal.Parse(ret[counter]);
                        break;
                    case "INT32":
                        obj.Valore = Int32.Parse(ret[counter]);
                        break;
                    default:
                        throw new Exception("Parser, tipo non supportato");
                    }
 
                counter += 1;
                }
 
Forse tu conosci un metodo più elegante e performante, perchè mi sa che quel 
dynamic obj = kvp.Value;
non è il massimo della velocità
 
Stefano
 


 
Fa concettualmente una cosa simile, in un ambito totalmente diverso, 
sfruttando perï¿œ quello che il framework offre.


Grazie Mauro, 
 
le tue risposte sono come quelle di Rialdi.... ti fanno vedere quel qualcosa che dal tuo punto di vista non riesci a vedere.
 
Provo a fare quello che mi consigli per il Parametro e sicuramente mi leggo bene il codice di che mi hai consigliato, in effetti lo switch è proprio brutto da vedere.
 
Radical è un bel progetto, poi adesso che stai aggiungendo la doc per me sarà più facile accedervi.
Saluti
Stefano

 piï¿œ facile accedervi.
 
molto bene, se hai feedback, anche sulla documentazione, fatti sotto.



 
LOL! :) (e grazie a Stefano!)
 
-- 
Raffaele Rialdi  
http://www.iamraf.net
 
Weblog: 
http://blogs.ugidotnet.org/raffaele
 
Microsoft MVP profile 
https://mvp.support.microsoft.com/profile/raffaele
 
UGIdotNET - 
http://www.ugidotnet.org/