Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

Cast da tipo a tipo generico

16 views
Skip to first unread message

Stefano Paparesta

unread,
Jan 10, 2013, 2:48:34 AM1/10/13
to
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

Mauro Servienti [MVP]

unread,
Jan 11, 2013, 1:06:49 AM1/11/13
to
Ciao Stefano,

You wrote on 10/01/2013 :
> vorrei poter estrarre (cast) da kvp (Parametro) il relativo Parametro<T>.
> 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


Stefano Paparesta

unread,
Jan 14, 2013, 3:51:59 AM1/14/13
to
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

Mauro Servienti [MVP]

unread,
Jan 15, 2013, 12:41:54 AM1/15/13
to
Ciao Stefano,

You wrote on 14/01/2013 :
> Forse tu conosci un metodo piᅵ elegante e performante, perchᅵ mi sa che quel
> dynamic obj = kvp.Value;
> non ᅵ il massimo della velocitᅵ

Se tu hai giᅵ i parametri creati e quindi _loro_ conoscono il tipo T,
perchᅵ non fare una cosa del genere:

abstract class Parametro
{
public abstract bool CanAccept( Object value );
public abstract void Accept( Object value );
}

class Parametro<T> : Parametro
{

}

a questo punto nel tuo foreach chiedi a Parametro se CanAccept una
valore, e lui dato che ᅵ implementato nella classe concreta che conosce
T, ᅵ in grado di stabilire se il tipo dell'Object che arriva ᅵ
compotabile o meno, in caso affermativo chiamo Accept

Per la conversione invece non ti serve quel terribile switch, dai un
occhio al metodo TryGetValue che trovi qui:

<http://radical.codeplex.com/SourceControl/changeset/view/84257#1476449>

Fa concettualmente una cosa simile, in un ambito totalmente diverso,
sfruttando perᅵ quello che il framework offre.

Stefano Paparesta

unread,
Jan 15, 2013, 4:41:26 AM1/15/13
to
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

Mauro Servienti [MVP]

unread,
Jan 16, 2013, 3:47:52 AM1/16/13
to
Ciao Stefano,

You wrote on 15/01/2013 :
> le tue risposte sono come quelle di Rialdi.... ti fanno vedere quel qualcosa
> che dal tuo punto di vista non riesci a vedere.

questo lo metto nel CV, grazie per il complimento :-)

> 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.

molto bene, se hai feedback, anche sulla documentazione, fatti sotto.

Raffaele Rialdi [MVP]

unread,
Jan 16, 2013, 10:47:18 AM1/16/13
to
Mauro Servienti [MVP] wrote:
> Ciao Stefano,
>
> You wrote on 15/01/2013 :
>> le tue risposte sono come quelle di Rialdi.... ti fanno vedere quel
>> qualcosa che dal tuo punto di vista non riesci a vedere.
>
> questo lo metto nel CV, grazie per il complimento :-)
>

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/


0 new messages