2009-11-04 5 views
1

Je souhaite avoir une fonction générique pour quelques types tels que long, TimeSpan et DateTime.Utilisation de types spécifiques basés sur typeof dans la fonction générique

public static T Parse<T>(string text) 
{ 
    T store; 

    if(typeof(T) == typeof(TimeSpan) 
     store = (T)((object) new TimeSpan(0, 1, 0)); 
    else 
    { 
     T.tryParse(text, out store); 
    } 
    return store; 
} 

Existe-t-il un meilleur moyen que le double T/objet cast?

Le t.tryParse ne compile pas, comment puis-je accomplir quelque chose de similaire?

+0

Quelle est l'erreur de compilation? – Ucodia

Répondre

6

Il me semble qu'il serait préférable d'avoir une méthode surchargée dans ce cas. TryParse - Int32.TryParse est une méthode totalement différente de Int64.TryParse etc. Cela vous éloignera aussi de la double distribution (que je suis d'accord est laide, mais malheureusement difficile à éviter). Cela signifie également que vous spécifieriez quels types vous pouvez vraiment soutenir.

Une alternative consiste à utiliser un Dictionary<Type, Func<string, object>>:

// Add some error checking, obviously :) 
Func<string, object> parser = parsers[typeof(T)]; 
return (T) parser(form.Text); 

puis mis en place le dictionnaire avec quelque chose comme:

static readonly Dictionary<Type, Func<string, object>> parsers = 
    new Dictionary<Type, Func<string, object>>() 
{ 
    { typeof(int), x => int.Parse(x) }, 
    { typeof(TimeSpan) x => new TimeSpan(0, 1, 0) }, 
    ... 
} 

Si vous souhaitez utiliser TryParse au lieu de Parse, vous devrez créer votre propre type de délégué en raison de l'utilisation de paramètres out (qui ne sont pas pris en charge dans Func/Action). La vie devient un peu plus difficile à ce moment-là. En outre, pourquoi utilisez-vous un paramètre out au lieu d'une valeur de retour?

+0

La sortie dans la fonction Parse devait correspondre à la sortie de l'appel TryParse. Ma question avait seulement une exception du vrai code qui retourne un bool qui représente le résultat de TryParse. Je vais bientôt regarder dans la réponse, merci. – hultqvist

+0

Suppression du sort en réponse à votre question pour garder ma question centrée. – hultqvist

Questions connexes