Abbiamo 2 oggetti A & B: A è system.string e B è un tipo .net primitivo (stringa, int ecc.). vogliamo scrivere codice generico per assegnare il valore convertito (analizzato) di B in A. Qualche suggerimento? Grazie, Adi BardaConversioni di tipo dinamico C#
risposta
Il modo più pragmatico e versatile per fare conversioni di stringhe è con TypeConverter
:
public static T Parse<T>(string value)
{
// or ConvertFromInvariantString if you are doing serialization
return (T)TypeDescriptor.GetConverter(typeof(T)).ConvertFromString(value);
}
Altri tipi hanno tipo convertitori di implementare IConvertible
ecc, ed è anche possibile aggiungere convertitori a nuovi tipi - sia a livello di compilazione tempo;
[TypeConverter(typeof(MyCustomConverter))]
class Foo {...}
class MyCustomConverter : TypeConverter {
// override ConvertFrom/ConvertTo
}
e anche in fase di esecuzione se è necessario (per i tipi non si possiede):
TypeDescriptor.AddAttributes(typeof(Bar),
new TypeConverterAttribute(typeof(MyCustomConverter)));
Cosa c'è di sbagliato con il già esistente System.Convert classe e l'interfaccia IConvertible?
Come già accennato, System.Convert e IConvertible sarebbero la prima scommessa. Se per qualche motivo non è possibile utilizzarli (ad esempio, se le conversioni di sistema predefinite per i tipi incorporati non sono adeguati per te), un approccio consiste nel creare un dizionario che contenga i delegati per ogni conversione e fare una ricerca in questo per trova la conversione corretta quando necessario.
Ad esempio; quando si desidera convertire da stringa a digitare X si potrebbe avere la seguente:
using System;
using System.Collections.Generic;
class Program
{
static void Main(string[] args)
{
Console.WriteLine(SimpleConvert.To<double>("5.6"));
Console.WriteLine(SimpleConvert.To<decimal>("42"));
}
}
public static class SimpleConvert
{
public static T To<T>(string value)
{
Type target = typeof (T);
if (dicConversions.ContainsKey(target))
return (T) dicConversions[target](value);
throw new NotSupportedException("The specified type is not supported");
}
private static readonly Dictionary<Type, Func<string, object>> dicConversions = new Dictionary <Type, Func<string, object>> {
{ typeof (Decimal), v => Convert.ToDecimal(v) },
{ typeof (double), v => Convert.ToDouble(v) } };
}
Ovviamente, si sarebbe probabilmente vuole fare qualcosa di più interessante nella vostra routine di conversione personalizzato, ma dimostra il punto.
+1: approccio interessante per estendere l'IConvertible ai tipi non convertibili. –
C'è un overview of type conversions at MSDN dove è possibile ottenere maggiori informazioni sul tema. L'ho trovato utile
- 1. Conversioni implicite in C#
- 2. C++ conversioni auto
- 3. Conversioni implicite in C++
- 4. concatenamento conversioni utente in C++
- 5. Conversioni di tempo Unix in C#
- 6. C# aggiungendo conversioni implicite a tipi esistenti
- 7. puntatori a funzione e conversioni di tipo di ritorno
- 8. ottenere oggetti di tipo dinamico
- 9. Controllo di tipo statico e dinamico in C++
- 10. Dichiarare un tipo di dati in modo dinamico in C++
- 11. Come ottenere il tipo di un oggetto dinamico in C#?
- 12. SQL Server per le conversioni di tipo Net
- 13. tipo di ritorno dinamico di una funzione
- 14. Comportamento dinamico C# strano
- 15. casting dinamico nel parametro C#
- 16. Come creare il proprio tipo dinamico o oggetto dinamico in C#?
- 17. Valore predefinito del tipo dinamico?
- 18. C++: conversioni di riferimenti lvalue e rvalue riferimento
- 19. tipo dinamico nella visualizzazione MVC
- 20. Perché le conversioni implicite C funzionano come fanno?
- 21. dinamico rispetto al tipo di oggetto
- 22. Che è di tipo dinamico dell'oggetto
- 23. DataContract e dinamico tipo di ritorno WCF
- 24. Come sovraccaricare alcune conversioni di tipo Groovy per evitare tentativi/catture di NumberFormatException?
- 25. Override conversioni implicite di PREDEF
- 26. Creazione di conversioni definite dall'utente
- 27. Aggiunta della velocità di ordito a una famiglia di conversioni
- 28. Dinamico non rispetta il tipo restituito
- 29. C#: cast runtime dinamico
- 30. codice dinamico in C
In particolare, Convert.ChangeType potrebbe essere quello che stai cercando. – Noldorin