2012-01-22 4 views
0

J'écris une méthode qui font un casting et je dois recevoir un type comme paramter, par exemple:comment recevoir un type comme paramètre?

object foo(?? type, object input) { 

    if(type is x) { 
     Output output = new Output(); 
     x xValue = (x) input; 
     foreach(var val xValue) { 
      //do.. 
     } 

     return output; 
    } 

    if(type is y) { 
      Output2 output = new Output2(); 
      y yValue = (y) input; 

     foreach(var val yValue) { 
      //do.. 
     } 

     return output; 
    } else { 
     //invalid type 
    } 
} 

différentes façons de le résoudre sont appréciées aussi :)

Merci à l'avance.

+0

type comme dans 'système. Tapez ou tapez comme dans un objet d'un type spécifique (ou hérité)? –

+0

un type comme 'CookieCollection',' CookieContainer' .. – Jack

Répondre

4

Utilisez un paramètre de type:

object foo<T>(T input) { 
    if (T is x) { ... 
    ... 

En outre, votre méthode est un peu bizarre, il semble y avoir beaucoup de points communs dans vos branches, et les tests pour les types est normalement une bonne approche. Faites un effort pour les unifier ou diviser la méthode spécifique de type surcharge:

Output foo(x input) ... 

Output2 foo(y input) ... 

... 

Et, essayez d'utiliser un type de retour plus précis, comme indiqué ci-dessus.

1

Pour faire ce que vous demandez:

object foo(System.Type type, object input) { 
... 
} 

Cependant pourquoi ne pas utiliser des méthodes différentes pour chaque type? Qu'est-ce que vous gagnez en ayant une méthode monolithique qui peut gérer différents types?

1

Il semble que vous vouliez un Type comme entrée où le type est le type du paramètre input. Si oui, alors le plus simple est d'utiliser une fonction générique

object foo<T>(T input) { 
    Type type = typeof(T); 
    ... 
} 

Vous pourriez même avoir une surcharge qui prend la Type explicitement et ont la charge de la fonction générique en elle

object foo<T>(T input) { 
    return foo(typeof(T), input); 
} 

object foo(Type type, object input) { 
    ... 
} 
+0

pouvez-vous développer? C'est exactement ce que je cherche. Je demande des valeurs à partir d'un ensemble de données, et je demande au développeur d'envoyer le type de variable à renvoyer afin que mon instruction return soit quelque chose comme (returnType) ds.Tables [0] .Rows [0] [columnName] – ganders

+0

@ganders dans ce cas, vous voudriez essentiellement faire quelque chose comme le suivant 'T foo () {return (T) ...; } ' – JaredPar

Questions connexes