web-dev-qa-db-fra.com

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

Hypothétiquement, ce serait pratique pour moi de faire ceci:

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

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

Oui, je pouvais le faire sous forme de drapeau booléen ou similaire, je me demandais simplement s'il y avait un moyen de l'adopter, puis de demander:

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

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

105
Mark Mayo

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);

179
Reed Copsey

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);
16
Peter Ritchie

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)
11
Mark Byers
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);
8
Danny Varod

Vous pouvez le faire, juste l'envelopper dans typeof()

foo.GetColumnValues(typeof(int))

public void GetColumnValues(Type type)
{
    //logic
}
1
Kevin DiTraglia

Vous pouvez utiliser un argument de type Type - iow, pass typeof (int). Vous pouvez également utiliser des génériques pour une approche (probablement plus efficace).

Utilisez des types génériques!

  class DataExtraction<T>
{
    DateRangeReport dateRange;
    List<Predicate> predicates;
    List<string> cids;

    public DataExtraction( DateRangeReport dateRange,
                           List<Predicate> predicates,
                           List<string> cids)            

    {
        this.dateRange = dateRange;
        this.predicates = predicates;
        this.cids = cids;
    }
}

Et appelez ça comme ça:

  DataExtraction<AdPerformanceRow> extractor = new DataExtraction<AdPerformanceRow>(dates, predicates , cids);
0
Boris Detry