2017-10-20 18 views
2

Je reçois l'exception mentionnée dans le titre à la ligne de codeC# non-concordance de comptage des paramètres de conversion Liste à DataTable

values[i] = Props[i].GetValue(item, null); 

et je ne suis pas sûr de ce qui cause cela. Toute aide serait appréciée.

public static DataTable ToDataTable<T>(List<T> items) 
{ 
    DataTable dataTable = new DataTable(typeof(T).Name); 


    PropertyInfo[] Props = typeof(T).GetProperties(BindingFlags.Public | BindingFlags.Instance); 
    foreach (PropertyInfo prop in Props) 
    { 

     var type = (prop.PropertyType.IsGenericType && prop.PropertyType.GetGenericTypeDefinition() == typeof(Nullable<>) ? Nullable.GetUnderlyingType(prop.PropertyType) : prop.PropertyType); 

     dataTable.Columns.Add(prop.Name, type); 
    } 
    foreach (T item in items) 
    { 
     var values = new object[Props.Length]; 
     for (int i = 0; i < Props.Length; i++) 
     { 
      values[i] = Props[i].GetValue(item, null); 
     } 
     dataTable.Rows.Add(values); 
    } 

    return dataTable; 
} 
+0

Quel type de données transmettez-vous? La méthode semble fonctionner correctement avec mes tests. Par exemple, voici avec une collection de base: https://dotnetfiddle.net/6RWBpz – Mun

+0

Trouvé un article connexe avec un google rapide de votre sujet: https://stackoverflow.com/questions/32143085/parameter-count -mismatch-when-get-value-of-property-using-reflection –

+0

Les données sont une liste de chaînes. –

Répondre

2

Si cette ligne est de lancer l'exception

values[i] = Props[i].GetValue(item, null); 

... alors cela signifie que vous avez une propriété qui nécessite un paramètre. En C#, le seul type de propriété qui prend un paramètre est indexer. Je suppose que vous devriez simplement exclure l'indexeur de la boucle. Voir this question qui vous indique comment détecter un indexeur.

Vous pouvez probablement résoudre ce problème en changeant une ligne. Modifier cette ...

PropertyInfo[] Props = typeof(T).GetProperties(BindingFlags.Public | BindingFlags.Instance); 

... à cette ....

PropertyInfo[] Props = typeof(T) 
    .GetProperties(BindingFlags.Public | BindingFlags.Instance) 
    .Where(p => p.GetIndexParameters == null)) 
    .ToArray(); 
0

La question était en fait dans les données que je suis passé dans la méthode (une liste de chaînes). Il est apparu que la méthode GetValue() cherchait un objet. J'ai créé une classe avec une propriété de chaîne et j'ai changé mon type de liste qui était transmis à la classe et j'ai défini la propriété de la classe sur la chaîne que je passais à la liste dans ma boucle foreach. Désolé si cela n'a pas de sens juste essayer d'expliquer comment j'ai résolu cela, mais le problème aurait probablement pu être résolu de plusieurs façons. Merci a tous.