Je pense que vous faites quelque chose d'autre où vous montrer les points de suspension (...):
try
{
...
int ad_id = int.Parse(stringNumber);
return (T)(object)ad_id;
}
parce que j'essayé votre échantillon et je reçois un retour int
.
Vous n'avez vraiment aucun moyen, actuellement, de faire en sorte que votre retour se fasse au travail. Votre méthode s'appuiera sur des informations très spécifiques. Fournissez un peu plus d'informations là où vous avez les ellipses et une meilleure solution peut être recommandée.
Comme Jon mentionne, un intendant nullable? serait mieux. Testez la condition et si ce n'est pas un bon retour, vous pouvez vérifier
myInt.HasValue
.
Je suis méditais une solution complète à ce problème et est venu avec les éléments suivants:
static List<Type> numerics = new List<Type>();
static void Main(string[] args)
{
numerics.Add(typeof(Decimal));
numerics.Add(typeof(Double));
numerics.Add(typeof(Int16));
numerics.Add(typeof(Int32));
numerics.Add(typeof(Int64));
numerics.Add(typeof(Single));
numerics.Add(typeof(UInt16));
numerics.Add(typeof(UInt32));
numerics.Add(typeof(UInt64));
Console.WriteLine("StringNumber 55: {0} {1}", typeof(int), GetItemIdFromUrl<int>("55"));
Console.WriteLine("StringNumber 5B99: {0} {1}", typeof(int), GetItemIdFromUrl<int>("5B99"));
Console.ReadKey();
}
public static T GetItemIdFromUrl<T>(string stringNumber)
{
try
{
if (numerics.Contains(typeof(T)))
return (T)Convert.ChangeType(stringNumber, typeof(T));
else
return default(T);
}
catch (ArgumentException argEx)
{
Console.WriteLine("Exception\r\n{0}", argEx);
return default(T);
}
catch (FormatException formatEx)
{
Console.WriteLine("Exception\r\n{0}", formatEx);
return default(T);
}
}
Du 2 WriteLine
vous serez en mesure de voir ce qui se passe si un passe numérique non valide. Bien sûr, j'ai inclus les messages Exception
juste pour que vous puissiez voir ce qu'ils reviendraient. Ce n'est peut-être pas une solution glamour, mais je pense que c'est viable.
Je suis également venu avec ceci:
public static class GetNumeric<T>
{
public static Func<string, T> Value = stringValue => (T)Convert.ChangeType(stringValue, typeof(T));
}
Bien que je voudrais encore envelopper l'appel dans un bloc try/catch
.
Qu'est-ce que c'est censé faire exactement? Pourquoi essayez-vous de convertir un entier en 'T'? –
Pourquoi la méthode est-elle générique? Il échouera toujours si T n'est pas int ... –
non, je coupe le nombre de la chaîne (le paramètre) et ensuite je le lance comme un T (int, décimal, tout ce dont j'ai besoin) – Tony