Wouaow !
Bon… pour virer ce switch de $£’!§ il faut que j’explique ce que je veux faire exactement.
En fait je veux tout simplement charger des données d’un fichier csv dans une DataTable. Et j’ai la définition des colonnes de ce fichier comme ceci :
NOM_DE_LA_PREMIERE type (longueur)
NOM_DE_LA_DEUXIEME type (longueur)
NOM_DE_LA_TROISIEME type (longueur)
le paramètre longueur est optionnel.
je stocke ces informations dans un objet MyColumn :
public class MyColumn
{
public string Name { get; set; }
public Type Type { get; set; }
}
Un autre objet nommé MyObj contient (entre autre) un tableau de MyColumn :
public class MyObj
{
public MifColumn[] MifColumns { get; set; }
}
Maintenant que ça c’est fait, je veux charger le contenu de mon fichier csv dans un DataTable. Le type des DataColumns de la DataTable seraient définis par le type de MyColumn.
DataTable dataTable = new DataTable();
dataTable.Columns.AddRange(GetMyColumns(myObj));
il ne me reste plus qu’à remplir ma DataTable :
[code]while ((line = reader.ReadLine()) != null)
{
string lineParts = line.Split(‹ , ›);
DataRow newRow = dataTable.NewRow();
for (int i = 0; i < dataTable.Columns.Count; i++)
{
switch (Type.GetTypeCode(mifDoc.MifColumns[i].Type))
{
case TypeCode.String:
newRow[i] = Convert.ToString(lineParts[i].Trim('"'), CultureInfo.InvariantCulture);
break;
case TypeCode.Int32:
newRow[i] = Convert.ToInt32(lineParts[i], NumberFormatInfo.InvariantInfo);
break;
case TypeCode.Int16:
newRow[i] = Convert.ToInt16(lineParts[i], NumberFormatInfo.InvariantInfo);
break;
case TypeCode.Decimal:
newRow[i] = Convert.ToDecimal(lineParts[i], NumberFormatInfo.InvariantInfo);
break;
case TypeCode.Single:
newRow[i] = Convert.ToSingle(lineParts[i], NumberFormatInfo.InvariantInfo);
break;
case TypeCode.DateTime:
newRow[i] = Convert.ToDateTime(lineParts[i].Trim('"'), NumberFormatInfo.InvariantInfo);
break;
case TypeCode.Boolean:
newRow[i] = Convert.ToBoolean(lineParts[i], NumberFormatInfo.InvariantInfo);
break;
default:
break;
}
}
dataTable.Rows.Add(newRow);
}[/code]
et donc pour remplacer le switch j’avais pensé à faire quelque chose du genre :
[code]while ((line = reader.ReadLine()) != null)
{
string lineParts = line.Split(‹ , ›);
DataRow newRow = dataTable.NewRow();
for (int i = 0; i < dataTable.Columns.Count; i++)
{
// A la manière de Array.ConvertAll()
newRow[i] = MyConvert<string,T>(lineParts[i],MyObj.MyColumns[i].Type);
}
dataTable.Rows.Add(newRow);
}[/code]
Ou un truc du genre mais là je ne vois pas comment implémenter « MyConvert » :crying:(