Domanda

Il mio scenario dovrebbe essere semplice ... il tipo che voglio convertire DA è SEMPRE 'stringa'. Quello che voglio convertire in ... potrebbe essere molte cose: ints, DateTimes, ... stringhe, ecc.

Sarebbe facile:

string valueToConvertFrom = "123";

int blah = Convert.ToInt32(valueToConvertFrom);

Tuttavia ... Non so (fino al runtime) che il valore che devo convertire è un 'Int' (o qualunque altra cosa). Ho provato questo:

string valueToConvertFrom = "123";

Type convertToType = typeof(int);

object blah = Convert.ChangeType(valueToConvertFrom, convertToType);

Ma questo mi dà il seguente errore: " L'oggetto deve implementare IConvertible. "

Non voglio fare un'istruzione switch e chiamare " Convert.ToBlah " in base al nome del tipo ... qualche suggerimento?

È stato utile?

Soluzione

il modo più pulito per farlo è usare un TypeConverter. puoi ottenere un'istanza di un convertitore di tipi chiamando il TypeDescriptor .GetConverter e quindi utilizzando l'istanza del convertitore di tipi per eseguire la conversione. quindi qualcosa del genere:

string valueToConvertFrom = "123";

Type convertToType = typeof(int);

TypeConverter tc =  TypeDescriptor.GetConverter(convertToType);             

object blah =tc.ConvertFromString(valueToConvertFrom);

Altri suggerimenti

La classe String implementa IConvertible, questo codice DOVREBBE DOVREBBE funzionare. Quale versione di .NET stai mirando?

object o = Convert.ChangeType( str, convertToType );

Inoltre, la maggior parte dei tipi che hai citato implementa il metodo Parse, quindi il tuo colpo migliore potrebbe essere qualcosa del genere.

Type convertToType = ...;
MethodInfo mi = convertToType.GetMethod("Parse", BindingFlags.Static);
object blah;
if(mi != null)
{
    blah = mi.Invoke(null, new object[]{valueToConvertFrom});
}
else
{
    // the type doesn't implement the Parse method, handle it another way :/
}

La domanda di Timothy, applicata generalmente alla domanda sulla conversione dei tipi in .NET, è un grosso problema. Sebbene le strategie di conversione siano in qualche modo semplici in scenari specifici con tipi noti, sfortunatamente non esiste una strategia generalizzata in nessuna implementazione di .NET per realizzare la conversione del tipo in fase di esecuzione da un tipo arbitrario a un altro, né una strategia di questo tipo proviene da Redmond. Tuttavia, Microsoft fornisce alcune buone linee guida per il concetto generale di conversione del tipo, tra cui:

Ho dovuto affrontare lo stesso problema generale nei miei sistemi e come soluzione ho consolidato tutte le strategie standard in un unico metodo. La portata di questo problema è ampia e le relative strategie di conversione sono varie, quindi questo approccio consolidato può essere trattato solo in un articolo tecnico completo. Tuttavia, offro qui una copia della documentazione del mio metodo nella speranza che ciò ti aiuti a ottenere una solida comprensione dei requisiti generali che dovrai soddisfare se vuoi sviluppare una soluzione simile e generalizzata. Ecco il link alla mia documentazione:

Spero che questo ti aiuti,

Mark

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top