2017-10-18 42 views
0

Je récupère propertyInfos d'un type donné.System.NotSupportedException: '' DataSet 'prend en charge pas System.Nullable <>

Lorsqu'une propriété est de type Nullable<int> alors je ne peux pas ajouter le type de propriété à la collection dataTable.columns parce que je reçois une exception:

System.NotSupportedException: '' DataSet » ne soutient pas System.Nullable < >. '

foreach (var prop in propertyInfos) 
{ 
    if (prop.PropertyType == typeof(int?)) 
    { 
     dataTable.Columns.Add(prop.Name, prop.PropertyType); 
    } 
    else 
    { 
     dataTable.Columns.Add(prop.Name, prop.PropertyType); 

    } 
} 

Que dois-je changer dans le si article pour le faire fonctionner?

J'ai déjà ajouté null ou DBNull à la collection mais cela n'a pas aidé ?!

+0

Avez-vous essayé juste int? int est aussi un type. Vous pouvez déboguer et rechercher les types que vous obtenez lors de l'itération de vos propriétés. Ainsi, vous pouvez reconnaître à quel type vous devez comparer. Lorsque votre propriété provient de Nullable , vous pouvez rechercher typeof (int?), Puis obtenir le type sous-jacent via 'Type yourIntType = Nullable.GetUnderlyingType (prop.PropertyType);' – Bagerfahrer

+0

[Convertir liste générique/Enumerable en DataTable?] (Https : //stackoverflow.com/a/5805044/3110834) –

Répondre

4

Utilisez null coalescing operator et Nullable.GetUnderlyingType méthode à cet effet:

dataTable.Columns.Add(prop.Name, Nullable.GetUnderlyingType(
           prop.PropertyType) ?? prop.PropertyType); 
+0

Pas tout à fait là, vous devez également définir la colonne pour être nulle. – DavidG

+0

Non, je veux dire 'var column = dataTable.Columns.Add (...); column.AllowDBNull = true; '(ou' false' bien sûr) – DavidG

+1

@DavidG La valeur par défaut est vrai pour ['AllowDBNull'] (https://msdn.microsoft.com/fr-fr/library/system.data.datacolumn .allowdbnull (v = vs.110) .aspx). –