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.
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);
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);
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)
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);
Vous pouvez le faire, juste l'envelopper dans typeof()
foo.GetColumnValues(typeof(int))
public void GetColumnValues(Type type)
{
//logic
}
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);