159 votes

Passer juste un type en tant que paramètre en C #

Hypothétiquement, ça serait pratique pour moi de le faire:

foo.GetColumnValues(dm.mainColumn, int)
foo.GetColumnValues(dm.mainColumn, string)

où la GetColumns méthode appelle une méthode différente à l'intérieur en fonction du type passé.

Oui, je pourrais le faire comme un indicateur booléen ou similaire, je me demandais si il y avait moyen de passer, et puis lui demander:

typeof(arg[1]) ou similaire...

Je pourrais aussi remplacer la méthode, l'utilisation des génériques, etc - je sais qu'il y a différentes façons de le faire, j'étais juste curieux de savoir si cela était possible.

256voto

Reed Copsey Points 315315

Il y a deux approches communes. Tout d'abord, vous pouvez passer System.Type

 object GetColumnValue(string columnName, Type type)
{
    // Here, you can check specific types, as needed:

    if (type == typeof(int)) { // ...
 

Cela s'appellerait comme: int val = (int)GetColumnValue(columnName, typeof(int));

L'autre option serait d'utiliser des génériques:

 T GetColumnValue<T>(string columnName)
{
    // If you need the type, you can use typeof(T)...
 

Cela a l’avantage d’éviter la boxe et d’offrir un type de sécurité, et s’appellerait ainsi: int val = GetColumnValue<int>(columnName);

26voto

Peter Ritchie Points 18352

foo.GetColumnValues(dm.mainColumn, typeof(string))

Sinon, vous pouvez utiliser une méthode générique:

 public void GetColumnValues<T>(object mainColumn)
{
    GetColumnValues(mainColumn, typeof(T));
}
 

et vous pouvez ensuite l'utiliser comme:

 foo.GetColumnValues<string>(dm.mainColumn);
 

16voto

Mark Byers Points 318575

Vous pouvez passer un type en tant qu'argument, mais pour ce faire, vous devez utiliser typeof :

 foo.GetColumnValues(dm.mainColumn, typeof(int))
 

La méthode devra accepter un paramètre de type Type .


où la méthode GetColumns appellera une méthode différente en fonction du type transmis.

Si vous souhaitez ce comportement, vous ne devez pas transmettre le type en tant qu'argument, mais plutôt utiliser un paramètre de type.

 foo.GetColumnValues<int>(dm.mainColumn)
 

8voto

Danny Varod Points 8685
 foo.GetColumnValues(dm.mainColumn, typeof(int));
foo.GetColumnValues(dm.mainColumn, typeof(string));
 

Ou en utilisant des génériques:

 foo.GetColumnValues<int>(dm.mainColumn);
foo.GetColumnValues<string>(dm.mainColumn);
 

1voto

Kevin DiTraglia Points 9303

Vous pouvez le faire en l’emballant dans typeof()

 foo.GetColumnValues(typeof(int))

public void GetColumnValues(Type type)
{
    //logic
}
 

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X