Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1122 connectés 

  FORUM HardWare.fr
  Programmation
  C#/.NET managed

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

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

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

n°1762938
WhyMe
HFR ? Nan, connais pas ...
Posté le 22-07-2008 à 10:57:46  profilanswer
 

: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
mood
Publicité
Posté le 22-07-2008 à 10:57:46  profilanswer
 

n°1763116
WhyMe
HFR ? Nan, connais pas ...
Posté le 22-07-2008 à 13:19:48  profilanswer
 

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
n°1763179
WhyMe
HFR ? Nan, connais pas ...
Posté le 22-07-2008 à 14:20:18  profilanswer
 

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
n°1764233
MagicBuzz
Posté le 24-07-2008 à 13:56:54  profilanswer
 

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 ?

n°1764289
WhyMe
HFR ? Nan, connais pas ...
Posté le 24-07-2008 à 14:50:16  profilanswer
 

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
n°1764356
MagicBuzz
Posté le 24-07-2008 à 16:19:39  profilanswer
 

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
n°1764362
WhyMe
HFR ? Nan, connais pas ...
Posté le 24-07-2008 à 16:23:41  profilanswer
 

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

Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  C#/.NET managed

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

 

Sujets relatifs
IDE C++ Codeblocks ( open source ) ...[VB6] Récupérer un fichier image sur le web => Non résolu
récupérer une variablerecuperer le contenu du variable $_POST
[PHP]Recuperer l'ip d'un client connecté sur un serveur socket.C++ et linux
[C#] récuperer un flux httpProgrammation C++ et CPLEX
URL Rewriting de base... 
Plus de sujets relatifs à : [C#] Récuperer le type de base d'un System.Nullable


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR