[C#] Récuperer le type de base d'un System.Nullable

Récuperer le type de base d'un System.Nullable [C#] - C#/.NET managed - Programmation

Marsh Posté le 22-07-2008 à 10:57:46    

:hello:
Je ne connais pas les termes exacts, je veux récupérer le type du t d'un System.Nullable<t> pour ne pas avoir à tester avec tous les types.
 

Code :
  1. foreach ( PropertyInfo propertyInfo in invoiceItemForInvoicing.GetType().GetProperties() )
  2. {
  3. dataSet.Tables["AccountingItem"].Columns.Add ( propertyInfo.Name, propertyInfo.PropertyType ) ;
  4. }


 
Une idée ?
 
Merci


Message édité par WhyMe le 22-07-2008 à 11:01:13

---------------
FeedBack HFR
Reply

Marsh Posté le 22-07-2008 à 10:57:46   

Reply

Marsh Posté le 22-07-2008 à 13:19:48    

Trouvé !!!
 

Code :
  1. foreach ( PropertyInfo propertyInfo in _invoiceItemList[0].GetType().GetProperties() )
  2. {
  3. type = Nullable.GetUnderlyingType ( propertyInfo.PropertyType ) ;
  4. if ( type == null )
  5.  type = propertyInfo.PropertyType ;
  6. dataSet.Tables["AccountingItem"].Columns.Add ( propertyInfo.Name, type ) ;
  7. }


---------------
FeedBack HFR
Reply

Marsh Posté le 22-07-2008 à 14:20:18    

Au final j'ai réussi à faire ce que je voulais : créer un DataTable dynamiquement à partir d'une classe :
 

Code :
  1. DataSet dataSet ;
  2. dataSet = new DataSet() ;
  3. dataSet.Tables.Add ( new DataTable ( "AccountingItem" ) ) ;
  4. dataSet.Tables["AccountingItem"].Rows.Add ( dataSet.Tables["AccountingItem"].NewRow() ) ;
  5. foreach ( PropertyInfo propertyInfo in accountingItem.GetType().GetProperties() )
  6. {
  7. type = Nullable.GetUnderlyingType ( propertyInfo.PropertyType ) ;
  8. if ( type == null )
  9.  type = propertyInfo.PropertyType ;
  10. dataSet.Tables["AccountingItem"].Columns.Add ( propertyInfo.Name, type ) ;
  11. dataSet.Tables["AccountingItem"].Rows[0][propertyInfo.Name] = propertyInfo.GetValue ( accountingItem, null ) ;
  12. }


---------------
FeedBack HFR
Reply

Marsh Posté le 24-07-2008 à 13:56:54    

je t'aurais bien aidé, mais j'ai même pas compris ce que tu cherches à faire...
 
dans un datatable, t'as déjà une propriété DataType sur tes colonnes.
pourquoi tu pars dans de la réflexion pour récupérer la même chose ?

Reply

Marsh Posté le 24-07-2008 à 14:50:16    

Désolé, mais là c'est moi qui comprends pas ce que tu dis  [:airforceone]
 
Je cherche a construire un DataTable à partir d'un objet : je veux que le type des colonnes reflète le type des propriétés de mon objet et je remplis les valeurs avec les valeurs des propriétés par la même occasion.
 
 
Voilà ma fct au final

Code :
  1. private void BuildDataRowFromClass ( object classObject, string tableName, ref DataSet dataSet, int rowIndex )
  2. {
  3. Type type ;
  4. object value ;
  5. if ( dataSet.Tables.Contains ( tableName ) == false )
  6.  dataSet.Tables.Add ( new DataTable ( tableName ) ) ;
  7. dataSet.Tables[tableName].Rows.Add ( dataSet.Tables[tableName].NewRow() ) ;
  8. foreach ( PropertyInfo propertyInfo in classObject.GetType().GetProperties() )
  9. {
  10.  type = Nullable.GetUnderlyingType ( propertyInfo.PropertyType ) ;
  11.  if ( type == null )
  12.   type = propertyInfo.PropertyType ;
  13.  if ( type.Namespace == "System" )
  14.  {
  15.   value = propertyInfo.GetValue ( classObject, null ) ;
  16.   switch ( type.Name )
  17.   {
  18.    case "DateTime" :
  19.     // On force le DateTime en chaîne pour avoir des valeurs directement exploitables ds le XML
  20.     if ( rowIndex == 0 )
  21.      dataSet.Tables[tableName].Columns.Add ( propertyInfo.Name, typeof ( string ) ) ;
  22.     value = Convert.ToDateTime ( value ).ToString ( "dd/MM/yyyy" ) ;
  23.     break ;
  24.    case "Decimal" :
  25.     // On formate le 0 en 0.00
  26.     if ( rowIndex == 0 )
  27.      dataSet.Tables[tableName].Columns.Add ( propertyInfo.Name, type ) ;
  28.     if ( Convert.ToDecimal ( value ) == 0 )
  29.      value = 0.00m ;
  30.     break ;
  31.    default :
  32.     if ( rowIndex == 0 )
  33.      dataSet.Tables[tableName].Columns.Add ( propertyInfo.Name, type ) ;
  34.     break ;
  35.   }
  36.   if ( value != null )
  37.    dataSet.Tables[tableName].Rows[rowIndex][propertyInfo.Name] = value ;
  38.  }
  39. }
  40. }


 
Et l'utilisation

Code :
  1. dataSet = new DataSet() ;
  2. // Contract
  3. BuildDataRowFromClass ( contract, "Contract", ref dataSet ) ;
  4. // Contact
  5. BuildDataRowFromClass ( contact, "Contact", ref dataSet ) ;
  6. AddDataSetRelation ( ref dataSet, "Contract", "Contact", "ID_Contact" ) ;
  7. // AddressRelation
  8. BuildDataRowFromClass ( addressList.ToList()[0].addressRelation, "AddressRelation", ref dataSet ) ;
  9. AddDataSetRelation ( ref dataSet, "Contact", "AddressRelation", "ID_Contact" ) ;


 
C'est plus clair là ? ou c'est pire ? :D


Message édité par WhyMe le 24-07-2008 à 14:55:28

---------------
FeedBack HFR
Reply

Marsh Posté le 24-07-2008 à 16:19:39    

Ah ok, maintenant j'ai mieux compris ce que tu voulais faire :D (c'est vrai en plus)
Au début je croyais que t'essayer de récupérer le type des colonnes de ton datatable, et du coup je pigeais pas ;) Mais là c'est l'inverse


Message édité par MagicBuzz le 24-07-2008 à 16:20:21
Reply

Marsh Posté le 24-07-2008 à 16:23:41    

C'est vrai que vu que j'avais trouvé la solution tout seul, j'ai pas bien pris le tps de l'expliquer  [:airforceone]  
Maintenant c'est corrigé :D


---------------
FeedBack HFR
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed