2009-07-10 6 views
0

Nous avons créé une méthode générique comme ceci:Comment déterminer le type de la valeur retournée dans la méthode générique

 
public TReturnType GetValue(string key) 
{ 
    var configurationParameter = (from cp in _repository.ConfigurationParameters 
     where cp.ConfigurationParameterKey == key 
     select cp).FirstOrDefault(); 

    var returnValue (TReturnType)Convert.ChangeType(configurationParameter.ConfigurationParameterValue, typeof (TReturnType)); 
    return returnValue; 
} 

Maintenant, nous voudrions mettre un peu d'erreur de manipulation dans cette méthode de sorte qu'en cas nous attendons un type numérique que nous pouvons faire, par exemple, int.TryParse (returnValue, out myNewInt). Bien sûr, pour pouvoir faire cela, nous devrions être en mesure de déterminer le type de TReturnType dans la méthode.

Existe-t-il un moyen de le faire?

Merci pour votre aide. Cordialement.

Répondre

2

Bien sûr, ajoutez dans un code comme ceci:

if(typeof(TReturnType) == typeof(int)) 
{ 
    var number = (int)returnValue; 
    //Validate your output 
} 
+0

Oh mon dieu !!! C'était si simple est absolument embarrassant. Je dois absolument rentrer à la maison maintenant. Merci. –

3

Bien sûr, mais vous devriez considérer si cela est ou non une bonne idée. Vous pouvez toujours dire

if (typeof(T) == typeof(int)) whatever 

Mais cela est un peu une mauvaise odeur de code. Le point entier des génériques est de être générique. Si vous avez code spécial pour quand T est un nombre entier, alors pourquoi ne pas simplement ajouter une autre méthode qui gère exactement le cas entier?

+0

Je l'ai fait sur une collection générique qui prend en charge 3 types d'identifiants: les chaînes, les ints et les guids. Tout le reste jetterait une exception non implémentée. –

+0

Mieux vaut alors avoir trois méthodes. Faites vos génériques * génériques *, c'est pourquoi nous les avons appelés * génériques *. –

+0

Vous avez raison, j'étais probablement paresseux. –

Questions connexes